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()
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()
.
创建“虚拟”默认视图
<?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)