我正在测试侦听每个AlertDialog
片段中的ViewPager
按钮单击(正和中性)的功能。而且我现在正在使用Interface
方法,但遇到了一些麻烦。
所以结构是这样的,我有一个AlertDialog
创建的DialogFragment
,然后将一个带有两个片段的ViewPager
放入了DialogFragment
中。我的目标是,当我单击AlertDialog
上的Positive按钮时,我希望调用这两个ViewPager
片段中的某些方法,以便我可以收集这些片段上的数据。
现在的问题是,只有第二个片段响应,我不知道为什么。
以下是代码:
我创建了一个接口文件
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;
}
}
我的片段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();
}
}
我的片段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();
}
}
我在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;
}
}
我的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");
}
});
}
}
任何人都可以帮忙吗?我将非常感激!!!
答案 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();
}
}
对其他片段执行相同的操作。
希望有帮助!