1. ホーム
  2. java

[解決済み] Android - カスタム(複合)コンポーネントの作成

2022-06-27 03:24:23

質問

現在開発中のAndroidアプリには、かなり大きくなったメインアクティビティがあります。これは主に TabWidget に 3 つのタブがあるためです。各タブには、かなりの数のコンポーネントがあります。アクティビティは、これらすべてのコンポーネントを一度に制御する必要があります。したがって、このアクティビティには20のフィールドがあることが想像できると思います(ほとんどすべてのコンポーネントにフィールドがあります)。また、多くのロジック(クリックリスナー、リストへの入力ロジックなど)も含まれています。

コンポーネントベースのフレームワークで私が通常行うことは、すべてをカスタムコンポーネントに分割することです。各カスタム コンポーネントには、明確な責任があります。それは、独自のコンポーネントのセットと、そのコンポーネントに関連する他のすべてのロジックを含んでいます。

これをどのように行うか考えてみたところ、Android のドキュメントで「複合コントロール (Compound Control)」と呼ばれるものを見つけました。 http://developer.android.com/guide/topics/ui/custom-components.html#compound を参照し、quot;Compound Controls のセクションまでスクロールしてください) ビュー構造を定義する XML ファイルに基づいて、このようなコンポーネントを作成したいと思います。

ドキュメントでは、次のように書かれています。

Activity.と同じように のように、宣言的な(XMLベースの)アプローチを使用することができます。 (XMLベース)アプローチで または、コードからプログラム的にネストすることができます。 プログラム的に作成することができます。

これはいいニュースです。XML ベースのアプローチは、まさに私が欲しいものです! しかし、その方法は、"Activity" のようなものであること以外は書かれていません。でも、私がActivityでやっていることは setContentView(...) を呼び出してXMLからビューを膨らませることです。このメソッドは、例えば、サブクラス LinearLayout .

そこで、このように手動でXMLを膨らませてみました。

public class MyCompoundComponent extends LinearLayout {

    public MyCompoundComponent(Context context, AttributeSet attributeSet) {
        super(context, attributeSet);
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.my_layout, this);
    }
}

これは、読み込んでいる XML が LinearLayout がルート要素として宣言されていることを除けば、うまくいきます。この結果、膨張した LinearLayout の子であることになります。 MyCompoundComponent の子であり、それ自身は既に LinearLayout !! というわけで、冗長な LinearLayout が MyCompoundComponent と実際に必要なビューの間に冗長なLinearLayoutが存在することになります。

誰か、これにアプローチする良い方法を教えてください。 LinearLayout がインスタンス化されるのを避けるためです。

どのように解決するのですか?

使用方法 マージ タグをXMLのルートとして使用します。

<merge xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Your Layout -->
</merge>

この記事をチェックする