2

さて、再利用可能なコンポーネントをいくつか作成しようとしています。基本的に、以下で構成される複合レイアウトがあります。

-- ヘッダー
-- 説明
-- (任意の数のコントロール)
-- フッター

そのため、テキストやその他の変数のカスタム属性を使用して、ヘッダーとフッターを自動的に追加するカスタム ViewGroup があります。

それはすべてうまくいきますが、次のように XML でコントロール ビュー (非常に特殊なレイアウトを持つ) を指定できるようにしようとしています。

<com.mypackage.CustomLayout
    ///...
    >
    <com.mypackage.CustomControl
        //attributes
        />
    <com.mypackage.CustomControl2
        //attributes
        />
    <com.mypackage.CustomControl3
        //attributes
        />
</com.mypackage.CustomLayout>

私のカスタム コントロールでは、すべて次の一般的なパターンに従います。

レイアウト XML の例

<merge
    android:layout_width="match_parent"
    android:layout_height="100dp"
     //Attributes
    >
    <OtherView/>
    <OtherView/>
</merge>

対応するコントロール ビュー

public class ControlView extends LinearLayout {
    public ControlView (Context context) {
        super(context);
        init();
    }

    public ControlView (Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
        parseAttributes(attrs);
    }

    public ControlView (Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
        parseAttributes(attrs);
    }

    private void init () {
        LayoutInflater i = LayoutInflater.from(getContext());
        i.inflate(R.layout.example_layout, this);
        //Initialize subviews
    }
}

問題は、マージ タグのパラメーターが無視されることです。マージ タグで定義されたレイアウト パラメーターを使用する代わりに、カスタム コントロールごとlayout_widthにパラメーターを追加する必要があります。layout_height

メソッドでLayoutParams を設定しようとすると、属性が必要init()であることを示す実行時例外が引き続き発生します。layout_widthlayout_height

私がやっていることを行うためのより良い方法はありますか? LayoutParamsXML で提供されるパラメーター (存在する場合) に関係なく、カスタム コントロールの任意のインスタンスにプリセットを提供したいと思います。

4

0 に答える 0