java - 监听对话框在每个 ViewPager fragment 中单击肯定按钮

标签 java android android-fragments android-viewpager android-dialogfragment

我正在测试监听每个 ViewPager fragment 中的 AlertDialog 按钮单击(正和中性)的功能。我现在正在使用 Interface 方法,但遇到了一些麻烦。

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

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

代码如下:

  1. 我创建了一个接口(interface)文件

    public interface Communicator {
        void onConfirmClick();
    }
    
  2. 我有一个 DialogFragment

    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;
        }
    }
    
  3. 我的 fragment 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();
        }
    }
    
  4. 我的 fragment 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();
        }
    }
    
  5. 我的 ViewPager 适配器在 DialogFragment 中使用

    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;
        }
    }
    
  6. 我的主要 Activity

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

有人可以帮忙吗?我将非常感激!!!

最佳答案

使用某种 Communicator 接口(interface)的集合,而不是单个接口(interface)。每次附加子 fragment 时,您都会覆盖communicator

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

关于java - 监听对话框在每个 ViewPager fragment 中单击肯定按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56860333/

相关文章:

android - 在我的 Android 应用程序中将内部文件附加到 GMail 时出现问题

Android fragment 和线程

java - 消息驱动 Bean - 单总线、多激活规范

java - 创建适当的 ivy 配置(而不是弄乱 *)

android - Spinner 的 setOnItemSelectedListener 不调用

java - 无法让位置管理器在 Fragment 内工作

android - 在 Android Studio 中出现渲染问题, View 不显示

java - 是否弃用了 DTO 模式?

java - 使用 Twitter4j 时的凭据设置问题

java - 如何在java中获取特定日期UTC值