膨胀方法的两种不同签名之间的区别

时间:2015-12-21 08:23:36

标签: android android-arrayadapter android-spinner convertview

我在我的应用中为微调器设置了一个自定义的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);

它有效。

有人可以解释一下这两种方法的不同签名之间的区别吗?

1 个答案:

答案 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都将被丢弃,然后您将被问到“为什么框架忽略了布局我定义的自定义?我最好检查一下然后提交一个错误。“