Android Fragments getView返回视图的父级?

时间:2013-04-26 19:42:15

标签: android fragment

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

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

现在,我有一个视图,里面有相当数量的孩子,所以我想尝试保存,当我尝试通过实现一个ViewHolder类来实现“findViewById”,类似于在ListView适配器中完成的常见方式设置为onCreateView返回的视图的标记。

稍后我调用getView方法时会发生奇怪的行为。看来该片段正在返回我创建的视图的父节点而不是我创建的视图,这导致返回空标签。

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

 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会返回父节点而不是视图呢?

2 个答案:

答案 0 :(得分:1)

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

所以你需要用以下方法检查:

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

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

答案 1 :(得分:0)

onCreateView完成之前,您是否正在创建适配器?我有一个问题,我有一个函数调用getView()并在onCreateView返回之前操纵布局元素,导致使用不正确的视图。我最终将onCreateView的膨胀视图发送到函数,并且它工作正常。