我正在测试监听每个 ViewPager
fragment 中的 AlertDialog
按钮单击(正和中性)的功能。我现在正在使用 Interface
方法,但遇到了一些麻烦。
所以结构是这样的,我有一个由DialogFragment
创建的AlertDialog
,我把一个带有两个 fragment 的ViewPager
放入这个DialogFragment
。我的目标是,当我单击 AlertDialog
上的 Positive 按钮时,我希望调用这两个 ViewPager
fragment 中的一些方法,以便我可以收集这些 fragment 上的数据.
现在的问题是,只有第二个 fragment 响应,我不知道为什么。
代码如下:
我创建了一个接口(interface)文件
public interface Communicator { void onConfirmClick(); }
我有一个 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; } }
我的 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(); } }
我的 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(); } }
我的 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; } }
我的主要 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/