我已经四处搜索但无法找到解决此问题的方法。我有一个正在显示的片段,当你按下一个按钮时,它会打开一个新的活动。然后,当该Activity完成时,它会将一些intent数据返回给Fragment / Parent Activity。该数据有时会更改TextView或向Fragment添加按钮。但是,我还没有能够在不将片段重新添加到Backstack(popBackStack然后替换或添加)的情况下更新Fragment的视图。
我尝试过的一些事情是在Fragment的基本布局上调用invalidate()
和requestLayout()
,但刷新视图的唯一方法似乎是调用{ {1}}再次删除并重新添加它。有没有办法指定Fragment"内容视图"没有重装?
家长活动代码:
onCreateView()
片段代码(MyFragment):
// Used to retrieve the data from the first Activity
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == Activity.RESULT_OK) {
// Try to update the Fragment's view here
mMyFragment.refreshView(data.getString(NEW_BUTTON_TEXT));
}
}
对此的任何想法都会非常有用,谢谢!
答案 0 :(得分:1)
由于似乎没有办法强制刷新Fragment的视图,我最终只是分离并重新附加片段,以便再次调用onCreateView()
。这似乎是我想要的方式。我使用此解决方案作为起点,但需要添加commitAllowingStateLoss()
以防止崩溃:https://stackoverflow.com/a/19409266/1234752。允许状态丢失在这里很好,因为Fragment只是被重用并且数据仍然包含在其中。
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == Activity.RESULT_OK) {
myFragment.updateData(data.getString(NEW_BUTTON_TEXT));
// Need to use commitAllowingStateLoss() to prevent an IllegalStateException
// from being thrown
getSupportFragmentManager()
.beginTransaction()
.detach(mContactDetailsFragment)
.attach(mContactDetailsFragment)
.commitAllowingStateLoss();
}
}
答案 1 :(得分:0)
Is there a way to specify the Fragment's "content view" without reloading it?
不,这是因为每次活动更改时都会重新绘制片段,因此当您打开并完成一个活动时,您将调用片段oncreateView,因此每次重绘它。
<强>溶液强>
您可以将您的片段设为活动的内部类,并在onActivityResult
中设置一个FLAG,以检查是否需要刷新。
if (resultCode == Activity.RESULT_OK) {
isRefresh = true;
stringData = data.getString(NEW_BUTTON_TEXT));
}
当片段的onCreateView
被调用时
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mBaseLayout = inflater.inflate(R.layout.my_layout, container, false);
...
if(isRefresh)
refreshView(stringData)
return mBaseLayout;
}