如何更改片段内的视图?

mon*_*ack 42 android android-fragments

我有一个片段,可以像你期望的那样在onCreateView中创建它的视图.但是我想定期更改视图.

我的用例是片段显示来自Web服务的一些数据.当用户从列表(另一个片段)中选择一个选项时,此片段应切换到进度条,然后一旦加载,切换回数据视图.

我可以创建两个片段 - 加载片段和显示片段,但似乎因为这是一个封装的事件,我宁愿在一个片段内完成所有操作.

基本上我要问的是,片段内的setContentView是等价的.

小智 32

你可以用Fragment.getView().这将返回包含该容器的容器的视图Fragment.在那个视图中,你可以打电话removeAllViews.然后构建新视图并将其添加到您获得的视图中getView().

http://developer.android.com/reference/android/app/Fragment.html#getView()

  • 这个答案在技术上是不正确的.`getView()`返回`onCreateView()`中提供的`View`而不是容器`View` (2认同)
  • `getView()` 返回视图,但没有 `removeAllViews()` 方法。该方法似乎在`ViewGroup`中。我错过了什么吗? (2认同)

Sol*_*n14 26

如果出于任何原因,您想要更改整个片段视图(例如,将在成功时更改视图的异步URL请求),您可以在父活动中使用FragmentTransaction并动态创建新片段.

或者你可以保留片段并调用这个片段的方法来刷新自己.示例:在父活动中,我构建并存储片段列表List<RefreshFragment> mFragmentList.

这是RefreshFragment类(我的所有片段都在我的例子中扩展了这个):

public class RefreshFragment extends Fragment {
    protected Data data; // here your asynchronously loaded data

    public void setData(Data data) {
        this.data = data;
        // The reload fragment code here !
        if (! this.isDetached()) {
            getFragmentManager().beginTransaction()
               .detach(this)
               .attach(this)
               .commit();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在我的活动异步回调我可以调用:

for (RefreshFragment f : mFragmentList) f.setData(data);
Run Code Online (Sandbox Code Playgroud)

因此,每个片段都将使用正确的数据进行更新,并且当前附加的片段将立即更新.当然,您必须在片段中为您提供onCreateView.

重要的是片段可以重新加载自己getFragmentManager().

  • 这应该是比我尝试过的任何其他解决方案更有效的答案。谢谢你救了我的培根! (2认同)

Ovo*_*eta 5

创建“虚拟”默认视图

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

在片段的 onCreateView 方法中膨胀“虚拟”默认视图,并将其用作占位符以根据需要添加视图

private LayoutInflater mInflater;
private ViewGroup mContainer;

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState){
    mInflater = inflater;
    mContainer = container;

    View v =inflater.inflate(R.layout.home_view,container,false);
    placeholder = (ViewGroup) v;

    return placeholder;
}
Run Code Online (Sandbox Code Playgroud)

要将视图更改为新视图,您首先删除所有以前的视图,然后膨胀新视图并添加

View newView = mInflater.inflate(R.layout.custom_dash, mContainer, false);
placeholder.removeAllViews();
placeholder.addView(newView);
Run Code Online (Sandbox Code Playgroud)