私が現在開発している Android アプリには、かなり大きくなったメイン アクティビティがあります。これは主に、TabWidget
3 つのタブを持つ が含まれているためです。各タブにはかなりの数のコンポーネントがあります。アクティビティは、これらすべてのコンポーネントを一度に制御する必要があります。したがって、このアクティビティには約 20 のフィールド (ほぼすべてのコンポーネントのフィールド) があることが想像できると思います。また、多くのロジック (クリック リスナー、リストを埋めるロジックなど) も含まれています。
コンポーネント ベースのフレームワークで通常行うことは、すべてをカスタム コンポーネントに分割することです。その場合、各カスタム コンポーネントには明確な責任があります。独自のコンポーネントのセットと、そのコンポーネントに関連する他のすべてのロジックが含まれます。
これをどのように行うことができるかを理解しようとしたところ、Android のドキュメントで「複合コントロール」と呼ばれるものを見つけました。( http://developer.android.com/guide/topics/ui/custom-components.html#compoundを参照し、「複合コントロール」セクションまでスクロールします)構造を表示します。
ドキュメントには次のように書かれています。
アクティビティの場合と同様に、宣言型 (XML ベース) のアプローチを使用して含まれるコンポーネントを作成するか、コードからプログラムでネストすることができます。
それは朗報です!XML ベースのアプローチはまさに私が求めているものです! しかし、「アクティビティのように」ということを除いて、それを行う方法はわかりません...しかし、アクティビティで行うことは、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);
}
}
LinearLayout
ロードしている XMLがルート要素として宣言されているという事実を除いて、これは機能します。これにより、膨張したものは、それ自体がすでに!!LinearLayout
である子になります。これで、間に冗長な LinearLayoutと実際に必要なビューができました。MyCompoundComponent
LinearLayout
MyCompoundComponent
LinearLayout
冗長なインスタンス化を回避して、これにアプローチするより良い方法を誰かが教えてくれますか?