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>
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を膨らませたときに同じように作成したい場合に機能します。
これを試して:
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);
mContainerView
はEditText
を含むLinearLayoutであり、row
はxmlファイル名です。
最も簡単な解決策
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 ...