38

いくつかの TextView をまとめただけのカスタム コンポーネントを作成しました。ここで、カスタム コントロールをコードから直接初期化し、テレビごとに個別にテキスト サイズを渡したいと考えています。

私の属性定義:

<resources>
    <declare-styleable name="BasicGauge">
        <attr name="valueTextSize" format="dimension" />
        <attr name="titleTextSize" format="dimension" />
        <attr name="unitsTextSize" format="dimension" />
    </declare-styleable>
</resources>

コンポーネントの初期化の例:

<pl.com.digita.BikeComputerUi.customviews.BasicGauge
    android:id="@+id/basicGauge1"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:padding="10dp"
    valueTextSize="40sp">

</pl.com.digita.BikeComputerUi.customviews.BasicGauge>

コンポーネントのコンストラクターでこれらの属性を読み取ろうとする方法:

final int N = typedArray.getIndexCount();
for (int i = 0; i < N; i++) {
    int attribute = typedArray.getIndex(i);
    switch (attribute) {
        case R.styleable.BasicGauge_valueTextSize:
            valueTextSize = typedArray.getString(attribute);
            break;
        case R.styleable.BasicGauge_titleTextSize:
            titleTextSize = typedArray.getString(attribute);
            break;
        case R.styleable.BasicGauge_unitsTextSize:
            unitsTextSize = typedArray.getString(attribute);
            break;
    }
    typedArray.recycle();
}

問題: 作成後、値はすべて null のままです。40spはまさに私の希望値です。

4

2 に答える 2

70

言うべきいくつかのこと:

  • 最初に、Android xmlns の場合とまったく同じ方法で、xml の先頭に xml 名前空間宣言行が必要です: xmlns:foo="http://schemas.android.com/apk/res-auto"
  • 次に、xmlns で valueTextSize のプレフィックスを付ける必要があります: foo:valueTextSize="40sp"

その後、文字列を取得するのはあまり良い考えではありません.Androidは、次元を処理するためのより強力なソリューションを提供しています:

int unitsTextSize = typedArray.getDimensionPixelSize(R.styleable.BasicGauge_unitsTextSize, textSize);

次に、いくつかの微妙な点があります。

  • Paint または TextPaint の場合、この値をそのまま使用できます。paint.setTextSize(unitTextSize):
  • テキストビューの場合、上記のアプローチは失敗し、setText のオーバーロードを使用して正しい結果を得る必要があります。textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, unitTextSize);

違いは、「生のピクセル」(密度に応じてスケーリングされていない、生のピクセル) と「スケーリングされたピクセル」(その反対) と呼ばれるものに由来します。

于 2013-05-16T20:43:46.373 に答える