【问题标题】:How to get button clicks in host fragment from dialog fragment如何从对话框片段中获取主机片段中的按钮点击
【发布时间】:2012-10-25 16:38:19
【问题描述】:

我有一个 listFragment,我想在 listItemClick 上显示一个 DialogFragment(是/否)。我想取回 listFragment 中的用户选择(是/否)。我已阅读有关侦听器接口机制的信息,但它适用于活动片段。一种方法可以是:

  1. 在包含是/否按钮选择功能的对话框片段中定义接口,并在警报对话框正/负按钮单击时调用这些方法。
  2. 在 Main Activity 中实现此接口。
  3. 在 listFragment 中点击 Item 时启动 dialogFragment。
  4. 在活动中保存用户选择。
  5. 通过在 Main Activity 中实现的另一个接口在 listFragment 中获取此选择。

但是对于这个简单的任务,我们有什么简单的机制吗?有什么例子或代码吗?

【问题讨论】:

    标签: android android-fragments android-alertdialog


    【解决方案1】:

    还有另一种方法可以从 DialogFragment 中获取结果。

    您可以使用Fragment.setTargetFragment()。创建 DialogFragment 的实例时,将目标片段设置为它。然后在 DialogFragment 中你可以从Fragment.getTargetFragment() 获取这个片段。

    例如,您可以这样做:

    public interface DialogClickListener {
        public void onYesClick();
        public void onNoClick();
    }
    
    public class MyListFragment extends ListFragment implements DialogClickListener {
    
        ...
    
        private void showDialog() {
            DialogFragment dialog = new MyDialogFragment();
            dialog.setTargetFragment(this, 0);
            dialog.show(getFragmentManager(), "dialog");
        }
    
        @Override
        public void onYesClick() {
            // do something
        }
    
        @Override
        public void onNoClick() {
            // do something
        }
    }
    
    public class MyDialogFragment extends DialogFragment {
        private DialogClickListener callback;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            try {
                callback = (DialogClickListener) getTargetFragment();
            } catch (ClassCastException e) {
                throw new ClassCastException("Calling fragment must implement DialogClickListener interface");
            }
        }
    
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
            builder.setMessage("message")
                    .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int id) {
                            callback.onYesClick();
                        }
                    }).setNegativeButton("No", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int id) {
                            callback.onNoClick();
                        }
                    });
    
            return builder.create();
        }
    }
    

    【讨论】:

    • 非常感谢!这正是我想要的!
    • 不适用于“import android.support.v4.app.ListFragment;”和 dialog.setTargetFragment(this, 0);我的 ListFragment 让我出错:Fragment 中的 setTargetFragment (android.app.Fragment, int) 无法应用于 (com.xyz.xyz.CursorAdapterFragment, int)
    • @powder366 有什么解决办法吗??
    • 感谢 J-rooft 帮了我很多忙!到处我发现对话片段通信的活动!您的回答帮助我将子片段制作为对话框片段回调!
    • 哇,这应该记录得更清楚,我总是通过活动传递回调。
    【解决方案2】:

    您还可以使用事件总线来促进组件之间的通信。 Otto 是一个很棒的库,可以在这里使用 --> https://github.com/square/otto 。它是由 Square 的人制作的,所以你知道它是一个高质量的开源项目。

    他们在存储库中有一个示例,向您展示了它的易用性。

    【讨论】:

    • 来自链接:“该项目已弃用,取而代之的是 RxJava 和 [RxAndroid](github.com/ReactiveX/RxAndroid) 。这些项目允许与 Otto 相同的事件驱动编程模型,但它们是功能更强大,并提供更好的线程控制。”对于像我这样正在寻找这些东西的人。 :)
    猜你喜欢
    • 1970-01-01
    • 2023-04-06
    • 2015-12-18
    • 2013-07-31
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    相关资源
    最近更新 更多