如何将对话框片段值从对话框返回到主要活动?

时间:2019-05-18 13:53:41

标签: java android

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


我的MainActivity中有一个Web视图,该视图基于我的应用程序,其他所有内容都是片段或对话框。 我需要能够引用该Webview,以便可以根据用户在对话框中输入的内容对其进行处理。

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

在对话框和其他类中,我无法执行此操作,因为它需要扩展其他内容,例如Dialog等。 那么如何从这些类中引用它呢?

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

JSInterface:

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

}

DialogFragment:

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;

我是编程的初学者,所以如果有人可以帮助我并解释我的操作方法,我将非常感谢。

2 个答案:

答案 0 :(得分:0)

是否从其他活动/片段中获取东西? startActivityForResult 通常,您应该看一下MVVM并创建一个ViewModel来保存所需的所有信息。 然后,您可以使用WebView对Activity中的该Infomation(也许是LiveData Observer?)做出反应。

答案 1 :(得分:0)

按照此处的说明创建对话框界面的说明:

Return values from DialogFragment