Fragment和DialogFragment生命周期关系

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Fragment和DialogFragment生命周期关系相关的知识,希望对你有一定的参考价值。

我有Fragment“A”,我有一个ImageButton到位。单击此按钮后,DialogFragment“B”被调用到前景,其中Fragment“A”在背景中部分可见。 DialogFragment“B”向用户显示选项列表。点击一个特定的选择DialogFragment“B”被Dismiss()Fragment解散“A”再次完全可见。

在这个动作中,我需要更新ImageButton“A”上的Fragment,以表示用户在DialogFragment“B”上做出的选择(基本上是ImageButton的新图像)。

我是否正确认为在ImageButton期间更新片段“A”上的OnResume的正确位置?片段“A”进入OnPauseFragmentDialog“B”正在展示吗?因此,从DialogFragment“B”返回时,Fragment“A”将触发其OnResume,我应该将更新更改为向用户呈现的ImageButton

我希望我的解释清楚。任何关于我应该更新ImageButton的地方和方式的详细帮助将受到高度赞赏。

答案

片段A不会进入onPause,所以onResume不会被称为http://developer.android.com/guide/components/fragments.html

恢复 片段在运行活动中可见。

已暂停 另一个活动位于前景并具有焦点,但此片段所在的活动仍然可见(前景活动部分透明或不覆盖整个屏幕)。

另一答案

当尝试使用Interface-Callback方法时遇到了同样的问题,但是当OnResume被解雇时FragmentDialogFragment没有被触发,因为我们没有切换到其他活动。

所以在这里,Event Bus让生活更加轻松。事件总线是最容易和最好的方式,只需三步即可在活动和片段之间进行交流,你可以看到它here

这只不过是发布/订阅事件总线机制。您将获得适当的文档here

将EventBus依赖项添加到您的gradle文件 - compile 'org.greenrobot:eventbus:x.x.x' 要么 compile 'org.greenrobot:eventbus:3.1.1'(具体版本)

对于上述情况 - 为用户事件创建一个自定义POJO类 -

public class UserEvent {
    public final int userId;

    public UserEvent(int userId) {
        this.userId = userId;
    }
}

订阅Fragment A的活动,无论何时从DialogFragment或其他地方发布/发布 -

@Subscribe(threadMode = ThreadMode.MAIN)
public void onUserEvent(UserEvent event) {
    // Do something with userId
    Toast.makeText(getActivity(), event.userId, Toast.LENGTH_SHORT).show();
}

Fragment A的生命周期中注册或取消注册EventBus,特别是在onStartonStop中 -

@Override
public void onStart() {
    super.onStart();
    EventBus.getDefault().register(this);
}

@Override
public void onStop() {
    EventBus.getDefault().unregister(this);
    super.onStop();
}

最后,点击特定项目,从DialogFragment发布/发布您的活动 -

EventBus.getDefault().post(new MessageEvent(user.getId()));
另一答案

通过添加ViewModels和LiveData解决这个问题变得更加容易。创建两个片段引用的viewModel。将下一行放在片段的OnCreate中。也可以在dialogfragment的onCreateDialog中。

myViewModel = ViewModelProviders.of(getActivity()).get(MyViewModel.class);

解除对话框后,调用myViewModel上的方法,该方法更新LiveData变量:

dialogBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            myViewModel.setButtonPressed(PositiveButtonPressed);
        }
    });
    dialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            myViewModel.setButtonPressed(NegativeButtonPressed)
        }
    });

在viewModel中,该方法将MutuableLiveData变量设置为例如要显示的图像。

void SetButtonPressed(int buttonPressed){
   if (buttonPressed==positiveButtonPressed){
       imageToBeShown.setValue(image A);
   }
   else{
      imageToBeShown.setValue(image B);
   }
}

在onActivityCreated中将观察者设置为LiveData变量:

myViewModel.imageToBeShown().observe(getViewLifecycleOwner(), new Observer<Image>() {
        @Override
        public void onChanged(@Nullable Image image) {
            button.setBackground(image);
            }
        }
    });

当然,您可以实现getter方法并将MutuableLiveData变量保持为私有。然后观察者观察到吸气剂方法。

以上是关于Fragment和DialogFragment生命周期关系的主要内容,如果未能解决你的问题,请参考以下文章

DialogFragment - 访问布局组件的位置[即editText.setText(“”)]

DialogFragment是从Activity还是Fragment打开的?

android DialogFragment 回调到 Fragment

如果从 Fragment 调用 DialogFragment 将引发 ClassCastException

显示 DialogFragment 时调用 Fragment 未暂停

侦听DialogFragment从ViewPager Fragment中删除事件