当前位置: 首页 > 知识库问答 >
问题:

在每个ViewPager片段中单击监听对话框正按钮

孔宇
2023-03-14

我正在测试一个监听AlertDialog按钮点击的功能(正

所以结构是这样的,我有一个由DialogFragment创建的AlertDialog,我把一个带有两个片段的ViewPager放入这个DialogFragment。我的目标是,当我点击AlertDialog上的肯定按钮时,我希望调用这两个ViewPager片段中的一些方法,以便收集这些片段上的数据。

现在的问题是,只有第二个片段的反应,我不知道为什么。

下面是代码:

>

  • 我创建了一个接口文件

    public interface Communicator {
        void onConfirmClick();
    }
    

    我有一段对话

    public class MainDialogFragment extends DialogFragment {
        View dialogLayout;
        Communicator communicator;
    
        @Override
        public void onAttachFragment(Fragment childFragment) {
            communicator = (Communicator) childFragment;
        }
    
        @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            return dialogLayout;
        }
    
        @NonNull
        @Override
        public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
            AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(getActivity());
            dialogLayout = getActivity().getLayoutInflater().inflate(R.layout.dialog_main, null);
            ViewPager viewPager = dialogLayout.findViewById(R.id.main_viewPager);
    
            final MainPagerAdapter adapter = new MainPagerAdapter(getChildFragmentManager());
            viewPager.setAdapter(adapter);
    
            dialogBuilder.setView(dialogLayout);
            dialogBuilder.setPositiveButton("Confirm", null);
            dialogBuilder.setNegativeButton("Cancel", null);
            dialogBuilder.setNeutralButton("Change", null);
    
            final AlertDialog dialog = dialogBuilder.create();
    
            dialog.setOnShowListener(new DialogInterface.OnShowListener() {
                @Override
                public void onShow(DialogInterface dialogInterface) {
                    dialog.getButton(DialogInterface.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            communicator.onConfirmClick();
                        }
                    });
    
            dialog.getButton(DialogInterface.BUTTON_NEUTRAL).setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            Toast.makeText(view.getContext(), "Change click!!", Toast.LENGTH_SHORT).show();
                        }
                    });
                }
            });
    
            return dialog;
        }
    }
    

    我的碎片A

    public class MainFragmentA extends Fragment implements Communicator{
        View rootView;
    
        @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            rootView = inflater.inflate(R.layout.fragment_a, container, false);
    
            return rootView;
        }
    
        @Override
        public void onConfirmClick() {
            Toast.makeText(getContext(), "Fragment A!!", Toast.LENGTH_SHORT).show();
        }
    }
    

    我的碎片B

    public class MainFragmentB extends Fragment implements Communicator{
        View rootView;
    
        @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            rootView = inflater.inflate(R.layout.fragment_b, container, false);
    
            return rootView;
        }
    
        @Override
        public void onConfirmClick() {
            Toast.makeText(getContext(), "Fragment B!!", Toast.LENGTH_SHORT).show();
        }
    }
    

    我的ViewPager适配器使用内部对话片段

    public class MainPagerAdapter extends FragmentPagerAdapter {
        public MainPagerAdapter(FragmentManager fragmentManager) {
            super(fragmentManager);
        }
    
        @Override
        public Fragment getItem(int position) {
            switch (position) {
                case 0:
                    return new MainFragmentA();
    
                case 1:
                    return new MainFragmentB();
    
                default:
                    throw new IllegalArgumentException("Wrong position!!");
            }
        }
    
        @Override
        public int getCount() {
            return 2;
        }
    }
    

    我的主要活动

    public class MainActivity extends AppCompatActivity{
        Button showDialogButton;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            showDialogButton = findViewById(R.id.main_show_dialog_button);
    
            showDialogButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    MainDialogFragment mainDialogFragment = new MainDialogFragment();
                    mainDialogFragment.show(getSupportFragmentManager(), "mainDialogFragment");
                }
            });
        }
    }
    

    有人能帮忙吗?我会非常感激的!!!

  • 共有2个答案

    甘明朗
    2023-03-14

    只有第二块碎片的通讯器能用

    这是因为您的每个片段中都有两个不同的通信器实例。当您设置ViewPager时,第二个片段是最后一个与父片段一起附加的片段。因此,您在MainDialogFraank类的onattachFraank函数中初始化的通信器只存储来自第二个片段的引用,因为这是最后一个附加在这里。

    在您的例子中,我建议使用片段的生命周期函数来实现一个非常简单的实现。只需在你的MainDialogFragment类中取一个public static变量,它将指示是否单击了OK按钮。然后检查onResume函数中每个Fragment类中该变量的值,并相应地执行任务。要了解实现方法,请检查以下内容。

    main对话框片段类中获取一个变量,如下所示。

    public static boolean isDialogOkayClicked = false; // Default false
    

    现在,在您的main片段a中,执行onResume功能,并检查main对话框片段中的值。采取相应的行动。

    public class MainFragmentA extends Fragment implements Communicator{
        View rootView;
    
        @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            rootView = inflater.inflate(R.layout.fragment_a, container, false);
    
            return rootView;
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            if(MainDialogFragment.isDialogOkayClicked) 
                doSomething();
        }
    
        @Override
        public void onConfirmClick() {
            Toast.makeText(getContext(), "Fragment A!!", Toast.LENGTH_SHORT).show();
        }
    }
    

    对你的另一个片段做同样的事情。

    希望这有帮助!

    长孙波鸿
    2023-03-14

    使用某种通信器的集合,而不是单一的接口。每次附加子片段时,都会覆盖通信

    public class MainDialogFragment extends DialogFragment {
        View dialogLayout;
        List<Communicator> communicators = new ArrayList<>();
    
        @Override
        public void onAttachFragment(Fragment childFragment) {
            communicators.add((Communicator) childFragment);
        }
    
        // all the other things from the MainDialogFragment...
    }
    

    并在BUTTON_POSITIVE回调中遍历列表。

    dialog.getButton(DialogInterface.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
            for (Communicator communicator : communicators) { 
                communicator.onConfirmClick();
            }
        }
    });
    

     类似资料:
    • 3.结束会话按钮的点击监听 在聊窗顶部有一个结束会话按钮,在结束会话时可以添加其他事件,使用的接口如下: Ntalker.getInstance().setOnCloseBtnListener(new OnCloseBtnClickListener() { @Override public void OnCloseBtnClick() { T

    • 当用户单击返回按钮时,我正在尝试退出应用程序,让它在单击是按钮时显示对话框是/否按钮,让它退出应用程序,包括注册活动,假设您在主活动上。 这是我的代码,但它不工作 单击主活动上的“后退”按钮时 如何从主活动退出应用程序,包括在是按钮单击对话框上的注册活动

    • 我试图打开一个片段,当一个对话框被点击在另一个片段。我在用ActionBarSherlock和Tab。我的片段附在视图页中。我几乎完成了这项工作。但是我不能替换视图页内的新片段。我有个错误。我读了这里的线程。解决办法还不清楚。 10-18 21:34:40.379:e/AndroidRuntime(19618):致命异常:main 10-18 21:34:40.379:e/AndroidRunti

    • 我似乎无法从扩展Fragment的类中获得imageview上的onClick事件。我在这里做错了什么?我对Android开发相对来说是新手..

    • 我遇到了一个如何在对话框片段中更新片段的问题。 当我单击过滤器菜单按钮时,会显示一个新的对话框片段,其中包括一个无线电组。 我想在单击ok按钮时更新包含位置列表的片段。 它是PlaceActive的代码,其中包含PlaceFraank: 公共类PlaceActive扩展AppCompatActive{ } 以下是PlaceFragment类的代码: 公共类PlaceFragment扩展了片段{ }

    • 这里有一个小问题,就像我在对话框中有回收人员视图fragment.ie在回收人员视图中的银行名称当我们在回收人员视图中选择一家银行并在对话框片段后解雇该名称应该出现在按钮上,即当我们从对话框片段中选择联合银行时,它应该出现在按钮上。问题是当我们单击按钮时,它的文本会发生变化,而不是在解散监听器的时间 这是Dialog解雇代码: 以下是onclick事件,其中打开对话框并打印值: 在以下方面相同: