刷新或重绘Fragment的视图

时间:2014-07-24 18:54:55

标签: java android android-layout android-fragments

我已经四处搜索但无法找到解决此问题的方法。我有一个正在显示的片段,当你按下一个按钮时,它会打开一个新的活动。然后,当该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));
    }
}

对此的任何想法都会非常有用,谢谢!

2 个答案:

答案 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;
}