web-dev-qa-db-ja.com

Android LinearLayoutクラスで表示する)を膨らませる方法は?

Xmlの小さな部分があり、アプリのさまざまな場所で使用します。このため、別のファイルに保存したいと思います。そこで、xmlを含むmywidget.xmlを作成しました。次に、これをmywidget.Javaで拡張しようとします。その後、次のように別のxmlファイルに含めます。

<com.mycom.Android.ui.widget.AmountWidget Android:layout_width="fill_parent" Android:layout_height="wrap_content"></com.mycom.Android.ui.widget.AmountWidget>

私のJavaファイルでは、次のように初期xmlを膨らませようとします。

public class AmountWidget extends LinearLayout {
    public AmountWidget(Context context) {
        super(context);
        LinearLayout ll = (LinearLayout) findViewById(R.layout.amount_widget);
        addView(ll);
    }
}

しかし、上記のコードでは、クラスcom.mycom.Android.ui.widget.AmountWigetを拡張するときにエラーが発生したというエラーが表示されます。

私の質問:レイアウトを膨らませて、別のxmlレイアウトファイルのクラスとして使用できるようにする方法を知っている人はいますか?

ウィジェットの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="wrap_content" 
    Android:layout_margin="10dp"
    Android:padding="10dp"
    Android:background="@layout/border"
    >
    <EditText
        Android:id="@+id/payment_amount_major"
        Android:layout_width="0dp"
        Android:layout_height="wrap_content"
        Android:textSize="35sp"
        Android:textStyle="bold"
        Android:inputType="number"
        Android:digits="0,1,2,3,4,5,6,7,8,9"
        Android:maxLength="9"  
        Android:gravity="right"
        />
</LinearLayout>
9
kramer65

Viewクラスには inflateメソッド があります。これは_LayoutInflater.inflate_をラップします。次を使用できるはずです。

_LinearLayout ll = (LinearLayout) inflate(context, R.layout.amount_widget, this);
_

ウィジェットをxmlから膨らませます。 addView()を呼び出す必要はありません。これは、inflateによって新しく膨らんだビューが追加されるためです。

編集:注意してください。このビューはすでにLinearLayoutであるため、インフレートするxmlのルートもLinearLayoutである必要はありません。親内に2番目のLinearLayoutをネストするのではなく、EditTextのみを膨らませてそれを親に追加すると、パフォーマンスが向上する可能性があります。 LinearLayout属性(背景やパディングなど)は、xmlで追加されている場所であればどこでもAmountWidgetに直接設定できます。この特定のケースでは、これはそれほど重要ではありませんが、ネストされたビューが多数ある状況がある場合は、今後知っておくとよいでしょう。

Edit2:Viewクラスには つのコンストラクター :View(Context)、View(Context、AttributeSet)、およびView(Context、AttributeSet、int)があります。システムがxmlからビューを膨らませるとき、後者の2つのうちの1つを使用します。カスタムビューは、これら3つのコンストラクターすべてを実装する必要があります。コードを再利用しながらこれを行う簡単な方法は次のとおりです。

_public AmountWidget(Context context) {
    super(context);
    LinearLayout ll = (LinearLayout) inflate(context, R.layout.amount_widget, this);
}

public AmountWidget(Context context, AttributeSet attrs) {
    this(context);
}

public AmountWidget(Context context, AttributeSet attrs, int defStyle) {
    this(context);
}
_

これは、属性やスタイル引数が何であるかを気にせず、AmountWidgetを膨らませたときに同じように作成したい場合に機能します。

4
MattDavis

これを試して:

mContainerView = (LinearLayout)findViewById(R.id.parentView);    
LayoutInflater inflater =(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
View myView = inflater.inflate(R.layout.row, null);  
mContainerView.addView(myView); 

mContainerViewEditTextを含むLinearLayoutであり、rowはxmlファイル名です。

12
ved

最も簡単な解決策

LinearLayout item = (LinearLayout )findViewById(R.id.item);//where you want to add/inflate a view as a child

View child = getLayoutInflater().inflate(R.layout.child, null);//child.xml

item.addView(child);

ImageView Imgitem = (ImageView ) child.findViewById(R.id.item_img);

Imgitem.setOnClick(new ...
5
Xar E Ahmer