我有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
的地点和方式的任何详细帮助都将受到高度赞赏。
答案 0 :(得分:1)
尝试使用Interface-Callback方法时遇到同样的问题,OnResume
Fragment
DialogFragment
在compile '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方法。