Слушать диалоги Позитивные нажатия кнопки в каждом фрагменте ViewPager - PullRequest
2 голосов
/ 03 июля 2019

Я тестирую функцию прослушивания нажатия кнопки AlertDialog (положительный и нейтральный) в каждом фрагменте ViewPager.И я сейчас использую метод Interface, но у меня возникают некоторые проблемы.

Итак, структура такая: у меня есть AlertDialog, созданный DialogFragment, и я ставлю ViewPager с двумяфрагменты в этом DialogFragment.Моя цель состоит в том, чтобы, когда я нажимал на кнопку «Позитив» на AlertDialog, я хотел, чтобы некоторые методы внутри этих двух 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. Адаптер My 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. My 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 ]

1 голос
/ 03 июля 2019

Работает только коммуникатор из второго фрагмента

Это потому, что у вас есть два разных экземпляра коммуникатора в каждом из ваших фрагментов. Когда вы настраиваете 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();
    }
}

Сделайте то же самое для вашего другого фрагмента.

Надеюсь, это поможет!

1 голос
/ 03 июля 2019

Используйте 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();
        }
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...