我目前正在进入Android 3.0预览版的片段API,并构建了以下最小编码:
我有一个Activty,它将嵌入Fragment(s),目前实现如下:
public class Cockpit extends Activity {/** Called when the activity is first created. */@OverrIDepublic voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.cockpit);}public static class InfoFragment extends Fragment { @OverrIDe public VIEw onCreateVIEw(LayoutInflater inflater, VIEwGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment VIEwGroup infoFragmentRoot = (VIEwGroup) getActivity().findVIEwByID( R.ID.infoFragmentRoot) ; return inflater.inflate(R.ID.infoFragment, container, false); }}
}
活动的相应布局:
<linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID"androID:orIEntation="vertical"androID:layout_wIDth="fill_parent"androID:layout_height="fill_parent"><fragment androID:name="test.androID.ui.cockpit.Cockpit$InfoFragment" androID:ID="@+ID/infoFragment" androID:layout_weight="1" androID:layout_wIDth="10dp" androID:layout_height="match_parent" > <linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" androID:padding="12dp" androID:ID="@+ID/infoFragmentRoot" > <TextVIEw androID:layout_wIDth="fill_parent" androID:layout_height="wrap_content" androID:text="@string/hello" /> </linearLayout></fragment>
现在,我不明白为什么内部类InfoFragment中的onCreateVIEw()中的VIEwGroup容器是一个nullpointer,我也不明白,
为什么
VIEwGroup infoFragmentRoot = (VIEwGroup) getActivity().findVIEwByID( R.ID.infoFragmentRoot) ;
返回也为null.
感谢您的反馈.
解决方法:
你在这里遇到了一些问题.首先,您不希望在< fragment>内添加标签.标签.将fragment标记视为占位符.片段的onCreateVIEw()方法负责定义片段的视图层次结构,而不是活动的布局XML文件.你可以做的是创建一个单独的布局XML文件,使其只是片段的布局.然后在onCreateVIEw()中,你接受传入的inflater,并执行以下 *** 作:
VIEw v = inflater.inflate(R.layout.frag1, container, false); TextVIEw text1 = (TextVIEw) v.findVIEwByID(R.ID.text1); text1.setText( myTextData ); return v;
请注意,inflate()的attach参数是false? AndroID将负责稍后将返回的视图附加到您的容器.
在片段获得onActivityCreated()回调之前,不保证您的活动的视图层次结构存在.因此,获取infoFragmentRoot的尝试可能会在onCreateVIEw()内返回null.但是我甚至不确定当这个标签被埋在你的< fragment>里面时会发生什么.
在这种特殊情况下,您将标记嵌入到活动的布局中,将使用标记中的其余属性调用片段的onInflate()回调.理论上,您可以将这些属性添加到片段上的参数包中,然后在onCreateVIEw()中使用setArguments()和getArguments())检索这些值.我在理论上说,因为看起来代码中存在处理配置更改的错误(例如,横向到纵向),导致在配置更改后重建片段时在onCreateVIEw()之后调用onInflate().请参见缺陷报告http://code.google.com/p/android/issues/detail?id=14796.
现在,我建议您将片段的布局提取到单独的布局XML文件(例如,frag1.xml),使用上面的代码在onCreateVIEw()中对该布局进行膨胀.并且不必担心传递给onInflate()的任何属性.
总结以上是内存溢出为你收集整理的不要在片段中获取rootLayoutContainer(Android 3.0预览版)全部内容,希望文章能够帮你解决不要在片段中获取rootLayoutContainer(Android 3.0预览版)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)