Android 作为片段子对象的Null对象

Android 作为片段子对象的Null对象,android,android-layout,android-fragments,android-viewpager,viewgroup,Android,Android Layout,Android Fragments,Android Viewpager,Viewgroup,我有一个片段,它是ViewPager的一部分。在这个片段中我有一个子视图组。现在,为什么在我的MainActivity的onCreate()中,在实例化了我的ViewPager和adapter之后,我的容器会得到null 这是我的onCreate(): 下面是片段,它是包含mContainerView <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.an

我有一个
片段
,它是
ViewPager
的一部分。在这个
片段中
我有一个子
视图组
。现在,为什么在我的
MainActivity
onCreate()
中,在实例化了我的
ViewPager
adapter
之后,我的
容器
会得到
null

这是我的
onCreate()

下面是
片段
,它是包含
mContainerView

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/content_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

<ScrollView android:layout_width="match_parent"
    android:layout_height="match_parent">
    <!-- This is my ViewGroup -->
   <LinearLayout android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:showDividers="middle"
        android:divider="?android:dividerHorizontal"
        android:animateLayoutChanges="true"
        android:paddingLeft="16dp"
        android:paddingRight="16dp" />

</ScrollView>

<TextView android:id="@android:id/empty"
    style="?android:textAppearanceSmall"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:padding="32dp"
    android:text="@string/message_empty_layout_changes"
    android:textColor="?android:textColorSecondary" />

</FrameLayout>

如果我正确地阅读了您的问题,那么您正试图使用
活动
findViewById()
方法访问
片段
视图
(和子项)。这不应该起作用,因为
片段
膨胀了它自己的布局,
片段
不是传统的
视图

如果知道已实例化
片段
,并且可以检索它,则可以使用

yourFragment#getView().findViewById()
如果没有,您可以使用接受
视图组
作为参数的方法创建一个由
活动
实现的接口。然后在片段的
onCreateView()
中,让片段将
ViewGroup
传递到接口。您可以直接强制转换到
活动
,但界面更干净

乙二醇

}

您的
活动将类似于:

public class MainActivity extends Activity implements ViewGroupCreateListener, OtherInterface1, OtherInterface2{

  private ViewGroup mViewGroup;


  public void onViewGroupCreated (ViewGroup v){
     mViewGroup = v;
  }
}
这很好,因为如果寻呼机重新实例化
片段
,活动仍然会获得
视图组
的有效实例


或者,如果取决于您实际尝试使用此
视图组实现的内容,您可能能够在
片段本身内部执行此处理。

如果我正确阅读了您的问题,您正在尝试访问
片段的
视图(以及儿童)使用
活动
findViewById()
方法。这不应该起作用,因为
片段
膨胀了它自己的布局,
片段
不是传统的
视图

如果知道已实例化
片段
,并且可以检索它,则可以使用

yourFragment#getView().findViewById()
如果没有,您可以使用接受
视图组
作为参数的方法创建一个由
活动
实现的接口。然后在片段的
onCreateView()
中,让片段将
ViewGroup
传递到接口。您可以直接强制转换到
活动
,但界面更干净

乙二醇

}

您的
活动将类似于:

public class MainActivity extends Activity implements ViewGroupCreateListener, OtherInterface1, OtherInterface2{

  private ViewGroup mViewGroup;


  public void onViewGroupCreated (ViewGroup v){
     mViewGroup = v;
  }
}
这很好,因为如果寻呼机重新实例化
片段
,活动仍然会获得
视图组
的有效实例


或者,根据您使用此
视图组
实际要实现的目标,您可以在
片段
本身内部执行此处理。

谢谢您的回答。我无法使用您显示的第一个选项获取
视图组的实例。这个应用程序一开始就给了我一个NPE。现在,第二个选择听起来不错。但是,我已经在我的主要活动中实现了另一个接口。这是我的;如果你不介意看看的话。我的问题是,我正在检索用户从对话框中选择的列表。之后,我想在提到的片段中添加一个视图,但是
Fragment1
的第48行中我的
mContainerView
为空。我如何才能以正确的方式实例化它?我尝试设置接口,但它抛出了我
08-06 21:48:42.018:E/AndroidRuntime(12352):致命异常:main 08-06 21:48:42.018:E/AndroidRuntime(12352):java.lang.ClassCastException:com.foodbuilder.MainActivity无法强制转换为com.foodbuilder.Fragment1$ViewGroupCreateListener
@LuisLavieri gist中的堆栈跟踪与代码不匹配,没有
行67
。关于其他方面:1)类可以实现的接口数量没有限制。2) 对于对话框逻辑,如果片段不应该启动对话框,那么将按如下方式执行:对话框更新,将数据传递给活动,活动更新片段(几乎像现在一样)。如果您在我的回答中实现了接口,那么它应该按预期工作,并且您避免了
静态
变量。您仍然需要在
MainActivity
中实现接口。可以实现多个接口,只需用逗号分隔(请参阅文章中的编辑)正确!我只是按照您在回答中的建议,在
视图
之后实例化了
视图组
,并在您在我的要点中看到的
更新()中使用它。现在,回到我的帖子,我的问题是,我不明白在实例化
视图组之前,我必须
充气
我的
视图
。你帮了我。再次感谢。谢谢你的回答。我无法使用您显示的第一个选项获取
视图组的实例。这个应用程序一开始就给了我一个NPE。现在,第二个选择听起来不错。但是,我已经在我的主要活动中实现了另一个接口。这是我的;如果你不介意看看的话。我的问题是,我正在检索用户从对话框中选择的列表。之后,我想在提到的片段中添加一个视图,但是
Fragment1
的第48行中我的
mContainerView
为空。我如何才能以正确的方式实例化它?我尝试设置接口,但它抛出了我
08-06 21:48:42.018:E/AndroidRuntime(12352):致命异常:main 08-06 21:48:42.018:E/AndroidRuntime(12352):java.lang.ClassCastException:com.foodbuilder.main无法将活动强制转换为com.foodbuilder.Fragment1$ViewGroupCreateListener
@LuisLavieri堆栈跟踪