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”进入OnPause
而FragmentDialog
“B”正在展示吗?因此,从DialogFragment
“B”返回时,Fragment
“A”将触发其OnResume
,我应该将更新更改为向用户呈现的ImageButton
?
我希望我的解释清楚。任何关于我应该更新ImageButton
的地方和方式的详细帮助将受到高度赞赏。
片段A不会进入onPause,所以onResume不会被称为http://developer.android.com/guide/components/fragments.html
恢复 片段在运行活动中可见。
已暂停 另一个活动位于前景并具有焦点,但此片段所在的活动仍然可见(前景活动部分透明或不覆盖整个屏幕)。
当尝试使用Interface-Callback方法时遇到了同样的问题,但是当OnResume
被解雇时Fragment
的DialogFragment
没有被触发,因为我们没有切换到其他活动。
所以在这里,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,特别是在onStart
和onStop
中 -
@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