10

ViewAndroidでカスタムを作成したいと思います。できるだけ簡単にしようとしましたが、ほとんど空のクラスを作成してMyView使用しましたLinearLayoutが、アプリケーションは「強制終了」で起動に失敗します。簡単なカスタムを行うにはどうすればよいViewですか? Building Custom ComponentsによるとView、オーバーライドしない場合、サイズは 100x100 になりますonMeasure()

public class MyView extends View {

    public MyView(Context context) {
        super(context);
    }
}

そして、私はそれをLinearLayoutwith で使用します:

<view
    class="com.example.MyView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="0.0" />

私は何を間違っていますか?


itemonが提案するコンストラクターと、それに対応するスーパークラスの呼び出しを使用するとします。次に、「強制終了」はなくなりましたが、私のLinearLayoutものは壊れていて、後のコンポーネントMyViewは表示されていません。

これが私のものmain.xmlです:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    >
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="0.0"
    android:background="#f00"
    android:text="Hello"
/>
<view
    class="com.example.MyView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="0.0"
/>
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="0.0"
    android:background="#00f"
    android:text="World"
/>
</LinearLayout>
4

2 に答える 2

10

次のような別のコンストラクター メソッドを定義できるかもしれません。

public MyView(Context context, AttributeSet attrs)

Android フレームワークは、上記のコンストラクターからのビューで UI を構築しようとします。

于 2010-12-14T14:31:26.340 に答える
10

Android デベロッパー ガイドには、Building Custom Components というセクションがあります。残念ながら、XML 属性の説明は、レイアウト ファイル内でのコントロールの宣言のみを対象としており、クラスの初期化内で実際に値を処理することは扱っていません。手順は次のとおりです。

values\attrs.xml で属性を宣言します

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="MyCustomView">
        <attr name="android:text"/>
        <attr name="android:textColor"/>            
        <attr name="extraInformation" format="string" />
    </declare-styleable>
</resources>

declare-styleable タグで修飾されていない名前が使用されていることに注意してください。extraInformation のような非標準の Android 属性は、型を宣言する必要があります。スーパークラスで宣言されたタグは、再宣言しなくてもサブクラスで使用できます。

コンストラクターを作成する

初期化に AttributeSet を使用するコンストラクターが 2 つあるため、コンストラクターが呼び出す個別の初期化メソッドを作成すると便利です。

private void init(AttributeSet attrs){  
    TypedArray a=getContext().obtainStyledAttributes(attrs,R.styleable.MyCustomView);
    //Use a
    Log.i("test",a.getString(R.styleable.MyCustomView_android_text));
    Log.i("test",""+a.getColor(R.styleable.MyCustomView_android_textColor, Color.BLACK));
    Log.i("test",a.getString(R.styleable.MyCustomView_android_extraInformation));
    //Don't forget this
    a.recycle();
}

R.styleable.MyCustomView は自動生成された int[] リソースで、各要素は属性の ID です。属性名を要素名に追加することにより、XML 内の各プロパティに対して属性が生成されます。その後、さまざまな get 関数を使用して TypedArray から属性を取得できます。属性が XML で定義されていない場合は、null が返されます。もちろん、戻り値の型がプリミティブの場合は例外で、その場合は 2 番目の引数が返されます。

すべての属性を取得したくない場合は、この配列を手動で作成することができます。標準の Android 属性の ID は android.R.attr に含まれていますが、このプロジェクトの属性は R.attr に含まれています。

int attrsWanted[]=new int[]{android.R.attr.text, R.attr.textColor};

このスレッドによると、将来変更される可能性があるため、android.R.styleable では何も使用しないでください。これらの定数をすべて 1 か所で表示できると便利であるため、ドキュメントにはまだ記載されています。

layout\main.xml などのレイアウト ファイルで使用する 名前空間宣言を含める

xmlns:app="http://schemas.android.com/apk/res/com.mycompany.projectname"

最上位の xml 要素にあります。

<com.mycompany.projectname.MyCustomView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@android:color/transparent"
    android:text="Test text"
    android:textColor="#FFFFFF"
app:extraInformation="My extra information";
/> 

完全修飾名を使用してカスタム ビューを参照します。

Android LabelView サンプル

完全な例が必要な場合は、android ラベル ビューのサンプルをご覧ください。

LabelView.java

TypedArray a=context.obtainStyledAttributes(attrs, R.styleable.LabelView);
CharSequences=a.getString(R.styleable.LabelView_text);
attrs.xml

<declare-styleable name="LabelView">
    <attr name="text"format="string"/>
    <attr name="textColor"format="color"/>
    <attr name="textSize"format="dimension"/>
</declare-styleable>

custom_view_1.xml

<com.example.android.apis.view.LabelView
    android:background="@drawable/blue"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    app:text="Blue"app:textSize="20dp"/>

これは、名前空間属性を持つ LinearLayout に含まれています。

xmlns:app="http://schemas.android.com/apk/res/com.example.android.apis"

于 2012-01-11T14:52:09.797 に答える