2

アプリのスピナー用にカスタマイズされた ArrayAdapter を使用しています。getDropDownView() メソッドのコードは次のとおりです。

@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;
    } 

tv.setText() の場合、TextView に対して NullPointerException がスローされます。

しかし、私が変更したとき

vista = inflater.inflate(R.layout.row_spinner, null);

vista = inflater.inflate(R.layout.row_spinner, parent, false);

できます。

メソッドの2つの異なる署名の違いについて誰かがもう少し説明できますか?

4

1 に答える 1

2

親ルート ビューを宣言することにより、そのビューの親 xml レイアウトを提供します。3 番目のブール値パラメーターは、この子ビューが親ビューに関連付けられているかどうかを決定します。これにより、子が親ビューのタッチ メソッドを継承するかどうかを決定します。

いずれにせよ、ビューを xml レイアウトの観点から全体像を把握する必要があります。これにより、作成したカスタマイズと xml 構造がビュー階層全体に実装されます。

インフレート(layout, parent, false) の使用 親レイアウトを使用して、親ビューにアタッチせずにビュー (この場合はスピナー) をインフレートします。null を使用すると、ビューにレイアウト パラメータが与えられないため、textview の xml のレイアウト パラメータは存在しません。

ドキュメントから:

root 生成された階層の親となるオプションのビュー (attachToRoot が true の場合)、または単に返された階層のルートの LayoutParams 値のセットを提供するオブジェクト (attachToRoot が false の場合)。

attachToRoot 膨張した階層をルート パラメータにアタッチする必要があるかどうか。false の場合、ルートは XML のルート ビューの LayoutParams の正しいサブクラスを作成するためにのみ使用されます。

戻り値
インフレートされた階層のルート ビュー。root が指定され、attachToRoot が true の場合、これは root です。それ以外の場合は、インフレートされた XML ファイルのルートです。

親ビューからビューをデタッチするのに null を使用するのは、それがアラート ダイアログのようなスタンドアロンの機能でない限り、適切な方法ではありません。

ビューにはルート ビューが必要です。null を渡すとうまくいく場合もありますが、これは、プログラムがビューの既定の xml パラメータを作成しようとするためです。

この記事では、さらに詳しく説明します。

では、この ViewGroup にアタッチする必要がないのに、なぜこの ViewGroup が与えられていると思いますか? 親ビューは、インフレートされる XML のルート要素で宣言された LayoutParams を評価するために必要であるため、インフレプロセスの非常に重要な部分であることがわかります。ここで何も渡さないことは、フレームワークに「このビューがどの親に関連付けられるかわかりません。申し訳ありません」と伝えることに似ています。</p>

これに関する問題は、android:layout_xxx 属性が常に親ビューのコンテキストで評価されることです。その結果、既知の親がないと、XML ツリーのルート要素で宣言したすべての LayoutParams が破棄され、「なぜフレームワークは私が定義したレイアウトのカスタマイズを無視するのか?」という疑問が残ります。SO を確認してから、バグを報告したほうがよいでしょう。」</p>

于 2015-12-21T08:52:34.653 に答える