片段和DialogFragment生命周期关系

时间:2015-07-16 12:30:26

标签: android android-fragments android-dialogfragment android-lifecycle

我有Fragment" A"我有ImageButton的地方。点击此按钮后,DialogFragment" B"被调用到前景Fragment" A"在背景中部分可见。 DialogFragment" B"向用户显示选择列表。点击特定选项DialogFragment" B"被Dismiss()Fragment" A"再次完全可见。

在此操作过程中,我需要更新ImageButton上的Fragment" A"代表用户在DialogFragment" B"上做出的选择; (基本上是ImageButton的新图像)。

我是否正确思考在片段" A"上更新ImageButton的正确位置?是OnResume期间? Fragment" A"进入OnPause FragmentDialog" B"正在展示?因此,从DialogFragment" B",Fragment" A"会触发OnResume以及我应该对用户提供的ImageButton进行更新更改的地方吗?

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

3 个答案:

答案 0 :(得分:1)

尝试使用Interface-Callback方法时遇到同样的问题,OnResume Fragment DialogFragmentcompile 'org.greenrobot:eventbus:x.x.x'被解除时没有被触发,因为我们没有切换到其他活动。

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

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

将EventBus依赖项添加到您的gradle文件中 -
compile 'org.greenrobot:eventbus:3.1.1'
OR
public class UserEvent { public final int userId; public UserEvent(int userId) { this.userId = userId; } } (具体版本)

对于上述情况 -

为用户事件创建一个自定义 POJO类 -

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

onStart生命周期中注册或取消注册您的EventBus,尤其是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())); -

{{1}}

答案 1 :(得分:0)

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

  


  该片段在正在运行的活动中可见。

     

暂停
  另一个活动是在前台并且有焦点,但活动   这个片段存在的地方仍然是可见的(前景活动   部分透明或不覆盖整个屏幕。

答案 2 :(得分:0)

通过添加ViewModels和LiveData解决此问题变得更加容易。创建两个片段都引用的viewModel。将下一行放在片段的OnCreate中。也可以在对话框片段的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变量保持私有。然后,观察者只需遵守getter方法。