我在我的应用中为微调器设置了一个自定义的ArrayAdapter。 这是getDropDownView()方法的代码:
regexp_replace(price::text, '[$,]', '', 'g')::numeric
当tv.setText()时,它会抛出TextView的NullPointerException。
然而,当我改变了
@Override
public View getDropDownView(int position, View convertView,ViewGroup parent) {
View vista = convertView;
if (vista==null) {
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
vista = inflater.inflate(R.layout.row_spinner,null);
}
TextView tv = (TextView) vista.findViewById( R.id.textview_entry );
if( !Utils.isSDKAbove( Utils.HONEY_COMB ) )
{
tv.setTextColor( getContext().getResources().getColor( android.R.color.primary_text_light ) );
}
tv.setText( getItem( position ) );
return vista;
}
到
vista = inflater.inflate(R.layout.row_spinner, null);
它有效。
有人可以解释一下这两种方法的不同签名之间的区别吗?
答案 0 :(得分:2)
通过声明父根视图,您将为该视图提供父xml布局。然后,第三个布尔参数确定此子视图是否附加到父视图。从而确定子是否继承父视图的触摸方法。
无论哪种方式,都需要根据xml布局来考虑视图,以便您在整个视图层次结构中实现自定义和xml结构。
使用膨胀(layout, parent, false)
您正在使用父布局来扩充视图(在本例中为微调器)
不将其附加到父视图。
使用null,您不会给视图任何布局参数,因此textview的xml布局参数不存在。
来自the docs:
root 可选视图,作为生成的层次结构的父级 (如果attachToRoot为true),或者只是提供的对象 返回层次结构的根的一组LayoutParams值 (如果attachToRoot为false。)
attachToRoot 是否应该是膨胀的层次结构 附加到根参数?如果为false,则root仅用于 为XML中的根视图创建正确的LayoutParams子类。
<强>返回强>
膨胀层次结构的根视图。 如果提供了root并且attachToRoot为true, 这是根;否则它是膨胀的XML文件的根。
使用null不是从父视图中分离视图的好方法,除非它是一个独立的功能,如警告对话框。
视图需要一个根视图,一些时候传递null,但只是因为程序试图为视图创建默认的xml参数。
This article详细介绍。
那么,如果我们不应该附加到ViewGroup,为什么我们会给这个ViewGroup?事实证明,父视图是通胀过程中非常重要的一部分,因为为了评估在被夸大的XML的根元素中声明的LayoutParams是必要的。在这里传递任何东西都类似于告诉框架“我不知道这个视图将附加到哪个父级,抱歉。”
这个问题是android:layout_xxx属性总是在父视图的上下文中计算。 因此,在没有任何已知父级的情况下,您在XML树的根元素上声明的所有LayoutParams都将被丢弃,然后您将被问到“为什么框架忽略了布局我定义的自定义?我最好检查一下然后提交一个错误。“