3

私のプロジェクトでは、同じパターンが何度も繰り返される画面があります。これは基本的に、見出し、画像、および特定の背景を持つ線形レイアウトで構成されるビューのコンテナーです。同じシーケンスを何度もコピーして貼り付けるのを避けるために、複合ビューを作成し、LinearLayout を拡張してそこですべての「スタイリング」を定義し、レイアウトでそのコンポーネントを使用するだけでよいと考えました。ハウツーと例に従って、複合ビューを機能させました。ただし、私が見たすべての例では、結果のビューを次のように使用しています。

<com.myproject.compound.myview
    ...some attrs...
/>

つまり、XML 経由で追加される子はありません。次のように使用する必要があります。

<com.myproject.compound.myview
    ...some attrs...>
    <TextView 
        ..../>
    ...other views...

</com.myproject.compound.myview>

LinearLayout を拡張しているので、「myview」タグも LinearLayout のように機能することを期待していましたが、何らかの理由で内部に配置したアイテムが描画されません。内部ビューを描画するために特別に行う必要があることはありますか?

私の拡張された LinearLayout は非常に単純です。メソッドをオーバーライドせず、コンストラクターで super を呼び出して、次のようにレイアウトを膨らませるだけです。

    LayoutInflater inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.my_compound_view, this, true);

更新: XML を参照点として追加すると思いました:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" 
android:background="@drawable/bg"
android:padding="12dp">
<TextView 
    android:id="@+id/section_title"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textColor="#FF0000AA"        />
<ImageView
    android:layout_width="match_parent"
    android:layout_height="2dp"
        android:src="@drawable/line"        />
</LinearLayout>
4

2 に答える 2

10

実際には、よりエレガントな解決策を見つけました。複合ビューでLinearLayoutの代わりにmergeタグを使用する必要があります。要約すると、次のようになります。

<merge xmlns:android="http://schemas.android.com/apk/res/android"
    <TextView 
        android:id="@+id/section_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="HEADING"
        android:textColor="#FF0000AA"        />
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="2dp"
        android:src="@drawable/line"        />
</merge>

public class CompoundLayout extends LinearLayout{
    public CompoundLayout(Context context, AttributeSet attrs) {
        super(context, attrs);

        LayoutInflater inflater = (LayoutInflater) context
           .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.compound_layout, this, true);
    }
}

メインレイアウト:

<com.testbench.CompoundLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#FFFFDDEE"
    android:orientation="vertical">
    <TextView 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Inner text"
            android:layout_gravity="center_horizontal"/>        
</com.testbench.CompoundLayout>
于 2013-03-20T05:04:04.287 に答える
6

Android のソースと例を読んだ後、私はこれを理解したと思います。基本的に、私の場合は、Compound View と Custom Layout のハイブリッドです。「複合ビュー」部分は、「コンテナー」を指定する XML のコンテンツのレイアウトと描画を処理します。しかし、そのコンテナ内のアイテムは後で膨張し、私の実装ではレイアウトされませんでした。1 つの方法は、カスタム レイアウト パスに従うことです。onLayout() と onMeasure() を実装して、自分の子供を適切に計算する必要があります (調査中に行ったところ、うまくいきました)。しかし、私は LinearLayout が既に行っていることとは異なるものを本当に必要とせず、そのコードをコピー/貼り付けしたくないので (これらのメソッドは巨大です)、メソッド onFinishInflate() をオーバーライドすることに決め、「コンテナビュー」を追加しました" そこの。

public class CompoundLayout extends LinearLayout{
View mView;
public CompoundLayout(Context context, AttributeSet attrs) {
    super(context, attrs);

    LayoutInflater inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        mView = inflater.inflate(R.layout.compound_layout, this, false);
}

@Override
public void onFinishInflate(){
    super.onFinishInflate();
    addView(mView, 0);
}
}

次に、Activity のメイン レイアウトで、LinearLayout を使用するのと同じ方法でカスタム レイアウトを使用します。同じようにレンダリングされますが、常に TextView と ImageView が一番上にあります。

于 2013-03-19T07:17:18.603 に答える