从DialogFragment返回值

7
我正在完成一个任务,需要在单击EditText后显示对话框。在该对话框中,我使用RecyclerViewRadioButton显示内容。
现在,我想要做的是,在从对话框中选择RadioButton(即RecyclerView中的内容)后,它应返回该内容的值,然后关闭对话框。
为了生成对话框,我使用了DialogFragment
由于我是新手,完全困惑并且无法找到解决方案。

发布你的问题代码。 - Iamat8
@Mohit 实际上,代码中没有错误,我无法弄清楚如何实现这个。 - Sanket Ranaware
我有以下类:ldDialog.java,ldListAdapter.java。显示对话框的代码为:editTextLeadSource.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { launchDialog("LeadSource"); } }); - Sanket Ranaware
1个回答

35

因为您的对话框是一个 DialogFragment,所以可以使用两个东西:

  1. 如果您从一个 Activity 启动对话框,可以使用接口
  • create an interface

    public interface ISelectedData {
        void onSelectedData(String string);
    }
    
  • implement an interface in your Activity

    public class MyActivity implements ISelectedData {
    
        .....
    
        @Override 
        public void onSelectedData(String myValue) {
            // Use the returned value
        }
    }
    
  • in your Dialog, attach the interface to your Activity

    private ISelectedData mCallback;
    
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
    
        try {
            mCallback = (ISelectedData) activity;
        }
        catch (ClassCastException e) {
            Log.d("MyDialog", "Activity doesn't implement the ISelectedData interface");
        }
    }
    
  • when returning the value to Activity, just call in your Dialog

    mCallback.onSelectedData("myValue");
    

    Check the example on the Android developer site.

  1. 如果您是从Fragment开始对话框,可以使用setTargetFragment(...)
  • starting the Dialog

    MyDialog dialog = new MyDialog();
    dialog.setTargetFragment(this, Constants.DIALOG_REQUEST_CODE);
    dialog.show(fragmentManager, Constants.DIALOG);
    
  • returning the value from the Dialog

    Bundle bundle = new Bundle();
    bundle.putString(Constants.MY_VALUE, "MyValue");
    
    Intent intent = new Intent().putExtras(bundle);
    
    getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, intent);
    
    dismiss();
    
  • getting the value in Fragment

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    
        if (requestCode == Constants.DIALOG_REQUEST_CODE) {
    
            if (resultCode == Activity.RESULT_OK) {
    
                if (data.getExtras().containsKey(Constants.MY_VALUE)) {
    
                    String myValue = data.getExtras().getString(Constants.MY_VALUE);
    
                    // Use the returned value
                }
            }
        }
    }     
    

我该如何在对话框中的RecyclerView的内容上设置点击事件,以便在该点击事件上获取值并设置到Edittextview中? - Sanket Ranaware
如果您需要为RecyclerView的行添加点击监听器,可以使用类似于这个的方法。类似地,您也可以为行内的视图设置监听器,或者使用获得了277个赞的答案这里 - Marko
还有一件事,你获取值的代码,我应该将其添加到onClick事件中吗? - Sanket Ranaware
哪个例子,第二个?你需要在 Fragment 中重写 onActivityResult 方法,值将自动返回。如果你想在 onClick 中返回值,你需要调用 getTargetFragment().onActivityResult()... 来返回值。 - Marko
@Marco,有一次我在recyclerView中点击了textView,它应该关闭对话框。但是,如果我在onClick()事件中放置dismiss(),它会给我一个NullPointerException。 - Sanket Ranaware
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接