java - 如何将对话框 fragment 值从对话框返回到主 Activity ?

标签 java android

编辑:我意识到我正在以错误的心态思考它,我需要“返回”在对话框中输入的值。标题已更新以反射(reflect)这一点。 对话框 fragment 是从 onNavigationItemSelected 调用的。 如何将这些值从对话框“返回”到主 Activity 以供使用?我无法从 onclicklistener 中的对话框调用 mainactivity 方法,它说“不能从静态上下文引用非静态方法”。

<小时/>

我的 MainActivity 中有一个 webview,我的应用程序基于该 webview,其他所有内容都是 fragment 或对话框。 我需要能够引用这个 webview,这样我就可以根据用户在对话框中输入的内容来用它做一些事情。

我有一个用于与 webview 交互的 JavaScriptInterface 类,我也遇到了同样的问题,但通过将其扩展到 MainActivity 来对其进行排序(我不知道这是否是最好的方法,可能不是)。

在对话框和其他类中我不能这样做,因为它需要扩展其他东西,即对话框等。 那么我如何从这些类中获取对它的引用呢?

主要 Activity :

public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {

    Context context;

    public WebView webView;
    JSInterface JSInterface;

    // other stuff

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        context = getApplicationContext();

        webView = findViewById(R.id.webView);
        JSInterface = new JSInterface(this, this);

    }

        @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();

        //creating fragment object
        Fragment fragment = null;

        //initializing the fragment object which is selected
        if (id == R.id.nav_home) {

        } else if (id == R.id.nav_go_to) {
            FragmentManager fm = getSupportFragmentManager();
            DialogFragmentGoTo dialogFragment = new MyDialogFragment();
            dialogFragment.show(fm, "MyDialogFragment");
        } 

        //replacing the fragment
        if (fragment != null) {
            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
            ft.add(R.id.content_main, fragment);
            ft.addToBackStack(null);
            ft.commit();
        }

        DrawerLayout drawer = findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }
}

JS接口(interface):

public class JSInterface extends MainActivity {

    private MainActivity mainActivity;
    JSInterface(Context context, MainActivity mActivity) {
        mainActivity = mActivity;
    }

    @JavascriptInterface
    public void someMethod() {
        //can interact with webview from here if needed, as if from mainactivity
    }

    // other methods

}

对话框 fragment :

public class DialogFragmentGoTo extends DialogFragment {

    Context context;
    EditText et1;
    EditText et2;
    LinearLayout layout;
    AlertDialog.Builder builder;

    String et1Text;
    String et2Text;

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        //init
        context = getContext();

        et1 = new EditText(context);
        et2 = new EditText(context);

        layout = new LinearLayout(context);
        builder = new AlertDialog.Builder(getActivity());

        //layout options
        layout.setOrientation(LinearLayout.VERTICAL);

        setDialog();

        builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                et1Text = et1.getText().toString();
                et1Text = et2.getText().toString();
                setInputs(et1Text, et2Text);
            }
        });

        builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dismiss();

            }
        });

        return builder.create();
    }

    private void setInputs(String et1Text, String et2Text) {
        webView.loadUrl("javascript:setInputs(" + et1Text + "," + et2Text + ");");
    }

    private void setDialog() {
        //et1
        et1.setRawInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);
        et1.setImeOptions(EditorInfo.IME_ACTION_UNSPECIFIED);
        et1.setSingleLine(true);
        et1.setLines(1);
        et1.setMaxLines(1);
        et1.setHorizontalScrollBarEnabled(false);
        et1.setHint("Text1");
        layout.addView(et1);

        //et2
        et2.setRawInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);
        et2.setImeOptions(EditorInfo.IME_ACTION_UNSPECIFIED);
        et2.setSingleLine(true);
        et2.setLines(1);
        et2.setMaxLines(1);
        et2.setHorizontalScrollBarEnabled(false);
        et2.setHint("Text2");
        layout.addView(et2);

        //builder
        builder.setTitle("Enter texts");
        builder.setView(layout);
    }
}

现在,如果我将其设为静态,我可以导入它,但这不是一个选项,而且对于 webview 来说这是不好的做法(内存泄漏):

import static com.example.app.MainActivity.webView;

我是编程初学者,因此如果有人可以帮助我并解释我如何做到这一点 - 我将非常感激。

最佳答案

从其他 Activity/fragment 获取东西? startActivityForResult 更一般地说,您应该查看 MVVM 并创建一个包含您需要的所有信息的 ViewModel。 然后您可以使用 WebView 对 Activity 中的信息(也许是 LiveData Observer?)使用react。

关于java - 如何将对话框 fragment 值从对话框返回到主 Activity ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56199602/

相关文章:

java - AChartEngine 运行时错误,NoClassDefFoundError

java - 如何将已移动的文件移动到新目录

android - 带有 AppCompat 的溢出菜单 textColor(使用硬件菜单键)

Java Applet 在没有 main 方法的情况下运行?

java - 该算法查找 Anagrams 的时间复杂度和空间复杂度是多少?

java - 解析JSON数据出错,org.json.json异常,java.lang.String无法转换

java - android webview url加载两次

android - Firebase 消息传递 - 什么 "content_available": true

android - 不能在通知中为 Intent 添加额外内容

android - Android ListView 的起始索引(位置)是什么,0 或 1