0

複数のアクティビティで再利用する複合コントロールを作成しました。このコントロールには多数の TextView と Button が含まれており、最も重要なのは ListView です。レイアウト ファイルで XML を定義し、この複合コントロールのコンストラクターで、XML を次のように拡張します。

    String service = Context.LAYOUT_INFLATER_SERVICE;
    LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(service);
    inflater.inflate(R.layout.map_menu, this, true);

レイアウト XML には ListView が含まれており、コンストラクターでも、この複合コントロールがアダプター (私のアダプターは ArrayAdapter を拡張します) とその配列の設定を処理します。

    ListView tableOfContentsList = (ListView) findViewById(R.id.tocListView);
    _layerAdapter = new LayerAdapter(context, R.layout.toc_layer_item, _layers);
    tableOfContentsList.setAdapter(_layerAdapter);

この複合コントロールは 2 つのアクティビティで使用されます。これらのアクティビティの 1 つは別のアクティビティを呼び出します。2 つのアクティビティ間の関係は意図されていません。

これが私の問題です。複合コントロールが初期アクティビティで作成されると、上記のコードが呼び出されて、このコントロールのアダプターが設定されます。次に、2 番目のアクティビティが作成されてナビゲートされると、このコントロールの 2 番目のインスタンスでコンストラクターが再度呼び出されます。これは、最初のアクティビティにある最初のコントロールに副作用があるようです。2 番目のコントロールは、最初のコントロールのアダプターの一部を上書きしているようです。これは、基本的に、2 番目のコントロールへのコンストラクターが呼び出されると、最初のアダプターが機能しないためです。

両方のコントロールで ListView のリソース ID を参照しているため、Android は 2 番目の ListView が作成されたときに最初の ListView からアダプターを削除していると思います。両方の ListView が同じリソース ID を持つと見なされるためですか? これは可能ですか?

これとまったく同じケースで、複数の複合コントロールが異なるアクティビティで (および単一のアクティビティで複数回) 使用されている場合に、以前に問題が発生しました。この問題は、XML レイアウトからの膨張が原因でした。以前の問題に対する私の解決策は、レイアウトからの膨張を取り除き、代わりにコードを介してオブジェクトを作成することでした。これらの複合コントロールははるかに単純で、ビューが 2 つしか含まれていないため、これは許容されましたが、複合コントロールに少なくとも 10 個のビューが含まれる上記の ListView のケースでは、各ビューをコードで定義することは受け入れられるソリューションではないと感じています。レイアウト XML が必要です。

XML から拡張され、複数のインスタンスで再利用されるカスタム複合コントロールを使用しているときに、この種の衝突動作を経験した人はいますか?

4

1 に答える 1

1

私の理解では、Androidは、xmlを膨らませるたびにウィジェットの新しいインスタンスを作成する必要があります。複合ウィジェットクラスに静的メンバーがありますか?

于 2011-05-19T14:11:48.703 に答える