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堆栈跟踪