【问题标题】:Refresh or redraw Fragment's View刷新或重绘 Fragment 的 View
【发布时间】:2014-07-24 18:54:55
【问题描述】:

我已经四处搜索,但无法找到解决此问题的方法。我有一个正在显示的片段,当您按下一个按钮时,它会在其上打开一个新的活动。然后,当该 Activity 完成时,它会将一些意图数据返回给 Fragment/Parent Activity。该数据有时会更改 TextView 或将按钮添加到 Fragment。但是,如果不将 Fragment 重新添加到后台堆栈(popBackStack 然后替换或添加),我无法更新 Fragment 的视图。

我尝试过的几件事是在 Fragment 的基本布局上调用 invalidate()requestLayout(),但刷新视图的唯一方法似乎是通过删除并重新添加它再次调用 onCreateView() .有没有办法在不重新加载的情况下指定 Fragment 的“内容视图”?

父活动代码:

// 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));
    }
}

片段代码(MyFragment):

private View mBaseLayout;

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    mBaseLayout = inflater.inflate(R.layout.my_layout, container, false);
    ...
    return mBaseLayout;
}

public void refreshView(String newButtonText) {
    Button button = mBaseLayout.findViewById(R.id.new_button);
    button.setText(newButtonText);
    button.setVisibility(View.VISIBLE);
    // TODO Reset the Fragment's view with the update mBaseLayout view
    // ? ? ?
    // Tried mBaseLayout.invalidate() and mBaseLayout.requestLayout() here 
}

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

【问题讨论】:

    标签: java android android-layout android-fragments


    【解决方案1】:

    由于似乎没有办法强制刷新 Fragment 的视图,因此我最终只是分离并重新附加了 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();
        }
    }
    

    【讨论】:

      【解决方案2】:
      Is there a way to specify the Fragment's "content view" without reloading it?
      

      不,这是因为每次 Activity 更改时都会重新绘制 Fragment,因此当您打开并完成一个 Activity 时,会调用 Fragment 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;
      }
      

      【讨论】:

      • 感谢您的回复。由于似乎没有办法只“重置”片段的视图,有没有办法重新创建片段(即myFragment = new MyFragment();),同时保留片段在后台的位置?我在onActivityResult() 中尝试了基本的mMyFragment = MyFragment.newInstance();,但它没有像我预期的那样重新创建片段。
      猜你喜欢
      • 2011-02-05
      • 1970-01-01
      • 2019-08-18
      • 1970-01-01
      • 1970-01-01
      • 2015-12-18
      • 1970-01-01
      • 1970-01-01
      • 2017-07-29
      相关资源
      最近更新 更多