9

これを行う方法を以前は知っていたかのように感じますが、現在は空白を描いています。View ( ) から拡張するクラスがあり、そのCardレイアウトを XML で記述しました。私がやりたいことは、ビューをCardコンストラクターの XML ビューに設定することです。これにより、メソッドを使用してs などCardを設定できます。TextView助言がありますか?以下のコード:

Card.java: (View.inflate(context, R.layout.card_layout, null);やりたいことの例としてそこにあるのですが、うまくいきません。基本的には、クラスをビューのインターフェイスにしたいのですが、そのためには、何らかの方法で XML レイアウトを割り当てる必要があります。の行に沿って何かを使用しますか?クラスにsetContentView(View view)はそのようなメソッドはありませんが、そのようなものはありますか?)View

public class Card extends View {

    TextView tv;

    public Card(Context context) {
        super(context);
        View.inflate(context, R.layout.card_layout, null);
        tv = (TextView) findViewById(R.id.tv);
    }

    public Card(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        View.inflate(context, R.layout.card_layout, null);
        tv = (TextView) findViewById(R.id.tv);
    }

    public Card(Context context, AttributeSet attrs) {
        super(context, attrs);
        View.inflate(context, R.layout.card_layout, null);
        tv = (TextView) findViewById(R.id.tv);
    }

    public void setText(String text) {
        tv.setText(text);
    }

}

card_layout.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="336dp"
    android:layout_height="280dp"
    android:layout_gravity="center"
    android:background="@drawable/card_bg"
    android:orientation="vertical" >


    <TextView
        android:id="@+id/tv"
        android:layout_height="fill_parent"
        android:layout_width="wrap_content"
        android:textSize="24dp"
    />

</LinearLayout>
4

2 に答える 2

9

あなたがやろうとしていることは、現在のセットアップでは不可能です。A View(またはその直接のサブクラス)は、子ビューの概念を持たない単一のビュー、つまりあなたがやろうとしていることを表します。単純なクラスには実際に子を追加するメソッドがないため(メソッドのように)、単純なクラスではLayoutInflater使用できません。ViewViewaddView()

一方、子を持つことができるようにするために使用する正しいクラスは、メソッドを提供することによって追加またはその他を受け入れる (または などの直接のサブクラスの 1 つ)ですViewGroup。最終的に、クラスは次のようになります。LinearLayoutFrameLayoutViewsViewGroupsaddView

public class Card extends ViewGroup {

    TextView tv;

    public Card(Context context) {
        super(context);
        View.inflate(context, R.layout.card_layout, this);
        tv = (TextView) findViewById(R.id.tv);
    }

    public Card(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        View.inflate(context, R.layout.card_layout, this);
        tv = (TextView) findViewById(R.id.tv);
    }

    public Card(Context context, AttributeSet attrs) {
        super(context, attrs);
        View.inflate(context, R.layout.card_layout, this);
        tv = (TextView) findViewById(R.id.tv);
    }

    public void setText(String text) {
        tv.setText(text);
    }

}

onLayoutを拡張する場合はオーバーライドする必要があることを思い出すとViewGroup、代わりに(レイアウトファイルのために)拡張を見て、xmlレイアウトの をタグLinearLayoutに置き換える必要があります。LinearLayoutmerge

于 2012-08-25T05:39:45.673 に答える
3

レイアウトでクラス名を使用できるはずです。何かのようなもの:

<your.package.name.Card 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="336dp"
    android:layout_height="280dp"
    ...

呼び出しfindViewByIdて子ビューを取得するだけです。

Card クラスを使用するには、インフレータを使用してインスタンスを取得し、それを親ビューにアタッチします。

LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
Card card = (Card) inflater.inflate(R.layout.card_layout, null);
parentView.addView(card);

詳細については、ドキュメントを参照してください。

于 2012-08-24T22:39:47.993 に答える