在每个ViewPager片段中,单击“侦听对话框”的正面按钮

时间:2019-07-02 21:38:58

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

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

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

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

以下是代码:

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

    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. 我的片段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. 我的片段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. 我在DialogFragment中使用的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;
        }
    }
    
  6. 我的MainActivity

    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 个答案:

答案 0 :(得分:1)

使用某种collection接口的Communicator而不是单个接口。每次附加子片段时,您将覆盖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();
        }
    }
});

答案 1 :(得分:1)

  

只有第二个片段中的传播者可以正常工作

这是因为每个片段中都有两个不同的communicator实例。设置ViewPager时,第二个片段是与父片段附加在一起的最后一个片段。因此,您正在communicator类的onAttachFragment函数内部初始化的MainDialogFragment仅存储来自第二个片段的引用,因为这是最后一个要附加的片段。

在您的情况下,我建议使用Fragment的生命周期函数进行非常简单的实现。只需在您的public static类中使用一个MainDialogFragment变量,它将指示是否单击了“确定”按钮。然后从Fragment函数中的每个onResume类检查该变量的值,并相应地执行任务。要了解实现方式,请检查以下内容。

在您的MainDialogFragment类中获取一个变量,如下所示。

public static boolean isDialogOkayClicked = false; // Default false

现在在您的MainFragmentA中,实现onResume函数并检查MainDialogFragment中的值。采取相应的措施。

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

对其他片段执行相同的操作。

希望有帮助!