【问题标题】:Activity not receiving callback from DialogFragment interfaceActivity 未收到来自 DialogFragment 接口的回调
【发布时间】:2016-07-27 19:18:54
【问题描述】:

我知道这是一个很常见的问题,但是,我浏览了很多类似的帖子,遵循了几个指南,但仍然无法解决这个问题。

以下是我的主要活动代码:

NavigationView mDrawerList = (NavigationView) findViewById(R.id.main_navigation);

    Menu navMenu = mDrawerList.getMenu();
    topChannelMenu = navMenu.addSubMenu("Stuff");
    final Button addButton = (Button) findViewById(R.id.add_button);
    addButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            MyDialog addDialog = new MyDialog();
            addDialog.show(getSupportFragmentManager(), "AddDialog");
            addDialog.setDialogResult(new AddDialog.MyDialogListener() {
                @Override
                public void onDialogPositiveClick(MyObject objectToSend) {
                    topChannelMenu.add(objectToSend.toString()); //Not getting called
                    Log.d(TAG, "Item added");
                }
            });


        }
    });

如您所见,按下了一个按钮(位于导航抽屉中),这将打开一个对话框(相关类包含在下面)。用户输入一些数据,然后按下一个肯定的对话框按钮,它应该提示数据被发送到活动。我尝试使用此答案中推荐的解决方案:How can I pass values between a Dialog and an Activity?。我知道我可能可以使用 Intent,但我真的很想实现观察者模式,因为这是我一直在努力理解的东西。

下面是MyDialog的代码:

public class MyDialog extends DialogFragment {


 MyDialogListener mListener;

public interface MyDialogListener{
    public void onDialogPositiveClick(MyObject objectToSend);
}
@Override
@NonNull
public Dialog onCreateDialog(Bundle savedInstanceState){

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    LayoutInflater inflater = getActivity().getLayoutInflater();
    View view = inflater.inflate(R.layout.add_plant_dialog, null);
    edit1 = (EditText) view.findViewById(R.id.res1_edit);
    edit2 = (EditText) view.findViewById(R.id.res2_edit);
    edit3 = (EditText) view.findViewById(R.id.res3_edit);
    builder.setView(view);
            builder.setPositiveButton(R.string.add, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    String selectedName = edit1.getText().toString();
                    String selectedSpec = edit2.getText().toString();
                    String selectedTemp = edit3.getText().toString();
                    MyObject userObject = new Plant(selectedName, selectedSpec);
                    mDBHandler = new DBHandler(getActivity(), null, null, 1); 
                    mDBHandler.addToDB(userObject);
                    mListener.onDialogPositiveClick(userObject);


                }
            })
            .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {


                }
            });


    //return createdDialog;
    return builder.create();
}

@Override
public void onAttach(Activity activity){
    super.onAttach(activity);
    // Verify that activity implements the listener
    try {
        // Instantiate the MyDialogListener so we can send events to host
        mListener = (MyDialogListener) activity;
    } catch (ClassCastException e){
        throw new ClassCastException(activity.toString() + " must implement " +
                "MyDialogListener interface");
    }
}

public void setDialogResult(MyDialogListener listener){
    mListener = listener;
}
}

我不太擅长使用接口,所以我不确定这是否是一个没有正确实现方法的简单错误,或者这是否与 DialogFragment 的生命周期有关。我真的很感激任何帮助。提前谢谢你。

【问题讨论】:

  • 你遇到了什么问题?
  • 第一个代码 sn-p 上注释的行永远不会被执行。活动中未调用 onDialogPositiveClick(MyObject objectToSend)。

标签: java android interface android-alertdialog


【解决方案1】:

您不需要通过方法显式设置侦听器。确保您的宿主 Activity 实现了该接口,并且它将在片段的 onAttach 方法中获取引用。

【讨论】:

  • 是的,做到了。删除了 setDialogResult(),并且只是覆盖了 onDialogPositiveClick()。正如我所说,我仍在努力掌握实现接口的窍门,因此感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多