Estoy probando una función de escuchar el AlertDialog
clic de botón (positivo y neutro) en cada ViewPager
fragmento. Y estoy usando el Interface
método en este momento, pero conseguir algunas dificultades.
Por lo que la estructura es así, tengo una AlertDialog
creada por DialogFragment
, y pongo una ViewPager
con dos fragmentos en este DialogFragment
. Mi objetivo es, al hacer clic en el botón positivos sobre el AlertDialog
, quiero algunos métodos dentro de los dos ViewPager
fragmentos de las llaman para que pueda recoger los datos sobre esos fragmentos.
Ahora el problema es que sólo las segundas respuestas de fragmentos, no sé por qué.
Estos son los códigos:
He creado un archivo de interfaz
public interface Communicator { void onConfirmClick(); }
Tengo un 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; } }
Un fragmento de mi
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(); } }
Mi fragmento 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(); } }
Mi adaptador ViewPager utiliza dentro 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; } }
mi 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"); } }); } }
Cualquiera puede ayudar? Voy a por lo agradezco !!!
Utilice una collection
de algún tipo de Communicator
interfaz en lugar de una sola. Se desea sobreescribir el communicator
cada vez que se conecta un fragmento de niño.
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...
}
Y en el BUTTON_POSITIVE
iterate devolución de llamada a través de la lista.
dialog.getButton(DialogInterface.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
for (Communicator communicator : communicators) {
communicator.onConfirmClick();
}
}
});