不要在片段中获取rootLayoutContainer(Android 3.0预览版)

不要在片段中获取rootLayoutContainer(Android 3.0预览版),第1张

概述我目前正在进入Android3.0预览版的片段API,并构建了以下最小编码:我有一个Activty,它将嵌入Fragment(s),目前实现如下:publicclassCockpitextendsActivity{/**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(BundlesavedInstanceState)

我目前正在进入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预览版)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1114025.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存