web-dev-qa-db-ja.com

LinearLayoutを正しく拡張してカスタムビューを作成する方法

いくつかの「カード」があります。これは、内部にTextViewを持つ単純なLinearLayoutです。

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:card="http://schemas.Android.com/apk/res-auto"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
>
 <TextView
        Android:id="@+id/card_label_txt"
        Android:layout_width="wrap_content"
        Android:text="label" />
</LinearLayout>

次に、LinearLayoutが垂直のメインフラグメントを作成します。このメインフラグメントでは、この「カード」をメインレイアウトに追加します。

# main fragment layout
View view = inflater.inflate(R.layout.main_activity, null);
LinearLayout ll = (LinearLayout) view
                .findViewById(R.id.main_activity_ll);
# get card
View card = inflater.inflate(R.layout.card, null);

# add to fragment layout
ll.addView(card);

これは非常にうまく機能し、カードはフラグメントレイアウトの幅全体を埋めます。実際に私が期待していること。

次に、カード用に別のクラスを作成しました。

Class Card extends LinearLayout{

public Card(Context context) {
        super(context);

        View view =  LayoutInflater.from(getContext()).inflate(
                R.layout.card, null);

        this.addView(view);

    }
}

そして、次のようにカードをメインフラグメントレイアウトに追加すると、

# main fragment layout
View view = inflater.inflate(R.layout.main_activity, null);
LinearLayout ll = (LinearLayout) view
                .findViewById(R.id.main_activity_ll);

# add new Card to fragment layout
ll.addView(new Card(getActivity());

それから追加されますが、カードの幅はもう埋められませんが、textviewにラップされます。

同じレイアウトを追加するこの2つの方法で幅のサイズが異なる理由を誰かに説明してもらえますか?

解決策この問題を解決するカードクラスが変更されました:

public Card(Context context) {
       super(context);

       LayoutInflater.from(getContext()).inflate(
                R.layout.card, this);
    }
}
16
user1908375

これは、カスタムViewクラスを実装する正しい方法ではありません。 Cardクラスの実装では、実際には不要な追加のLinearLayoutを作成しています。

最初に、LinearLayoutを拡張するCardクラスを実装します。次に、次のようなXMLレイアウトで参照します。

<com.mypackagename.Card xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:card="http://schemas.Android.com/apk/res-auto"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content" >
 <TextView
        Android:id="@+id/card_label_txt"
        Android:layout_width="wrap_content"
        Android:text="label" />
</com.mypackagename.Card>

Androidでカスタムビューを作成するための優れたチュートリアルです。

17
SBerg413