2013-04-26 45 views
4

所以我遇到了一些奇怪的行为,当涉及到片段类中的getVIew()方法。从文档我期待得到在onCreateView方法创建的视图在这里表示“查看该片段的布局(一个由onCreateView(LayoutInflater,ViewGroup中,束)返回)根认为,如果提供http://developer.android.com/reference/android/app/Fragment.html#getView()Android Fragments getView返回视图的父级?

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

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

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

android.widget.ScrollView [email protected] 
/android.widget.ScrollView 

,当我以后再打印使用getView()方法,我得到

android.support.v4.app.NoSaveStateFrameLayout 
    android.widget.ScrollView [email protected] 
    /android.widget.ScrollView 
/android.support.v4.app.NoSaveStateFrameLayout 

正如你可以看到滚动型是我居然在onCreateView方法创建视图。那么getView为什么返回父视图而不是视图?

+0

如果我没有弄错,'NoSaveStateFrameLayout'只出现在兼容包的片段中。无论如何,你总是可以使用'getView()。findViewById(R.id.theIdOfTheScrollView)'。 – Luksprog 2013-04-26 19:51:54

回答

0

难道是在onCreateView完成之前创建适配器吗?我有一个问题,我有一个函数调用getView()并在onCreateView返回之前操作布局元素,导致使用不正确的视图。我结束了从onCreateView发送到函数的充气视图,它工作得很好。

1

支持库将附加视图插入到视图层次结构中。根据NoSaveStateFrameLayout.java中的评论:“平台的预蜂窝版本没有View.setSaveFromParentEnabled(),所以我们在视图和它的父代之间插入它。”

所以,你要么需要检查这个的东西,如:

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

或者跟踪由onCreateView在一个实例变量返回的看法。

+0

感谢您的解释。我很惊讶为什么getView()没有返回我在onCreateView() – prettyvoid 2014-10-21 19:28:20

+1

中返回的相同视图尽管我使用的是v4 compat库,但我仍然无法在代码中使用NoSaveStateFrameLayout。 – prettyvoid 2014-10-21 19:36:03