4

因此,当涉及到片段类中的 getVIew() 方法时,我遇到了一些奇怪的行为。从文档中,我期望得到在 onCreateView 方法中创建的视图,如此处所述http://developer.android.com/reference/android/app/Fragment.html#getView()

“获取片段布局的根视图(由 onCreateView(LayoutInflater, ViewGroup, Bundle) 返回的那个),如果提供的话”

现在,我有一个视图,其中包含相当数量的孩子,所以我想在尝试和“findViewById”时尝试保存,方法是实现一个类似于在 ListView 适配器中完成的常见方式的 ViewHolder 类,我设置为从 onCreateView 返回的视图的标记。

当我调用 getView 方法时,稍后会出现奇怪的行为。看起来片段正在返回我创建的视图的父级,而不是我创建的视图,这会导致返回一个空标记。

我写了一小笔代码来打印出一个视图(如果视图实际上是一个视图组,则嵌套子级),这就是我得到的。

 android.widget.ScrollView  android.widget.ScrollView@4242dec0
 /android.widget.ScrollView 

当我稍后使用 getView() 方法打印它时,我得到

 android.support.v4.app.NoSaveStateFrameLayout
     android.widget.ScrollView  android.widget.ScrollView@4242dec0
     /android.widget.ScrollView 
 /android.support.v4.app.NoSaveStateFrameLayout 

如您所见,ScrollView 是我在 onCreateView 方法中实际创建的视图。那么为什么 getView 返回父视图而不是视图呢?

4

2 回答 2

1

支持库将一个附加视图插入到视图层次结构中。根据 NoSaveStateFrameLayout.java 中的评论:“Pre-Honeycomb 版本的平台没有 View.setSaveFromParentEnabled(),因此我们将其插入到视图及其父级之间。”

因此,您需要通过以下方式进行检查:

View myView = (NoSaveStateFrameLayout)getView();
if (myView != null) {
  myView = myView.getChildAt(0);
}

或者在实例变量中跟踪 onCreateView 返回的视图。

于 2014-05-02T18:40:38.887 回答
0

可能是您在onCreateView完成之前创建了适配器吗?我有一个问题,我有一个函数调用 getView() 并在 onCreateView 返回之前操作布局元素,导致使用不正确的视图。我最终将膨胀的视图从 onCreateView 发送到该函数,并且效果很好。

于 2013-04-30T21:58:03.553 回答