首页 > 解决方案 > 如何将对话框片段值从对话框返回到主要活动?

问题描述

编辑:我意识到我正在以错误的心态思考它,我需要“返回”在对话框中输入的值。标题已更新以反映这一点。从 onNavigationItemSelected 调用对话框片段。如何将这些值从对话框“返回”到要使用的主要活动?我无法从 onclicklistener 的对话框中调用 mainactivity 方法,它显示“无法从静态上下文引用非静态方法”。


我的 MainActivity 中有一个 webview,我的应用程序基于它,其他一切都是片段或对话框。我需要能够获得对这个 webview 的引用,以便我可以根据用户在对话框中输入的内容来使用它。

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

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

主要活动:

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接口:

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

}

对话片段:

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);
    }
}

现在,如果我将其设为静态,我可以导入它,但这不是 webviews 的选项和不好的做法(内存泄漏):

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

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

标签: javaandroid

解决方案


按照此处为对话框创建界面的说明进行操作:

从 DialogFragment 返回值


推荐阅读