1

作成中のカスタム テーブル行があります。XML ファイルを使用して、単一の行がどのように見えるかを定義したいと考えています。クラスに TableRow を拡張させ、それ自体を XML で定義されているファイルとして定義したいと考えています。XML ファイルは次のようになります。

<TableRow xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/label"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingRight="10dp"
        android:text="@string/loading"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <TextView
        android:id="@+id/data"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="right"
        android:text="@string/loading"
        android:textAppearance="?android:attr/textAppearanceLarge" />

</TableRow>

コードは次のようになります。

public class SpecialTableRow extends TableRow {

    public SpecialTableRow (Context context) {
        }
}   

クラス全体がtableRowであると想定するためにコンストラクターに入れることができるものはありますか? あるいは、よりうまく機能する別の構造はありますか?私が考え出した最高のものはこれです:

    TableRow tr=(TableRow) LayoutInflater.from(context).inflate(R.layout.text_pair,null);
    TextView mFieldName=(TextView) tr.findViewById(R.id.label);
    TextView mValue=(TextView) tr.findViewById(R.id.data);
    tr.removeAllViewsInLayout();
    addView(mFieldName);
    addView(mValue);

ただし、これにより XML からレイアウト パラメータが削除されます。もっと良いものはありますか?

4

3 に答える 3

1

カスタム ビューの作成に関するチュートリアルをご覧ください。TableRow をサブクラス化し、表示するビューを追加します。次に、新しいビューを XML レイアウトで直接使用し、さらに必要なカスタム属性を作成できます。TextPairRow という名前のカスタム TableRow を作成し、TableRow 内に表示する 2 つの TextView でレイアウトを拡張し、2 つの TextView を表示/非表示にする showLabel および showData カスタム属性を追加する例を含めました。最後に、XML レイアウトで新しいビューを直接使用する方法を含めました。

class TextPairRow extends TableRow {

    private TextView label, data;

     public TextPairRow (Context context, AttributeSet attrs) {
        super(context, attrs);

        TypedArray a = context.getTheme().obtainStyledAttributes(
                                           attrs,
                                           R.styleable.TextPairRow, 0, 0);

        try {
            showLabel = a.getBoolean(R.styleable.TextPairRow_showLabel, false);
            showData = a.getBoolean(R.styleable.TextPairRow_showData, false);
        } finally {
            a.recycle();
        }

        initViews();
    }

    private void initViews(){

       // Here you can inflate whatever you want to be in your 
       // view or add views programatically.
       // In this example, we'll just assume you have a basic XML 
       // layout which defines a LinearLayout with two TextViews.
       LinearLayout mLayout = (LinearLayout) 
           LayoutInflater.from(getContext()).inflate(R.layout.textview_layout, this);

       label = (TextView) mLayout.findViewById(R.id.label);
       data = (TextView) mLayout.findViewById(R.id.data);

       if(showLabel)
           label.setVisibility(View.VISIBLE);
       else
           label.setVisibility(View.GONE); // can also use View.INVISIBLE 
                                           // depending on your needs

       if(showData){
           data.setVisibility(View.VISIBLE);
       else
           data.setVisibility(View.GONE); // can also use View.INVISIBLE 
                                           // depending on your needs
    }
}

ここでカスタム XML 属性を定義します (次のファイルを検索または作成します: res/values/attrs.xml)。

<resources>
   <declare-styleable name="TextPairRow">
       <attr name="showText" format="boolean" />
       <attr name="showLabel" format="boolean" />
   </declare-styleable>
</resources>

最後に、新しいビューを XML レイアウトで直接使用するには:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:custom="http://schemas.android.com/apk/res-auto">
 <com.thefull.packageforyourview.TextPairRow    
     android:orientation="horizontal"
     custom:showData="true"
     custom:showLabel="true" />
</LinearLayout>

xmlns:custom="http://schemas.android.com/apk/res/com.thefull.packageforyourview"カスタム ビューがライブラリ プロジェクトに含まれるかどうかによっては、使用が必要になる場合があることに注意してください。とにかく、これまたは例にあるもののいずれかが機能します。

于 2013-10-22T22:09:03.563 に答える
1

これを行うための本当のトリックは、実際には非常に簡単です。メソッドの 2 番目のパラメーターを使用しますinflate。実際、最善の方法は次のとおりです。

LayoutInflater.from(context).inflate(R.layout.text_pair,this);

これにより、R.layout.text_pair がこれにインフレートされ、行全体が効果的に使用されます。ビューを手動で追加する必要はありません。Android が自動的に処理します。

于 2014-03-23T21:15:13.213 に答える