ページ

2012年1月30日月曜日

paddingの留意点

paddingの留意点

副題: CheckBox bug

この記事の続編をRadioButtonへのpaddingに書きました。(2012/05/09)

この記事ではCheckBoxを題材にしていますが、他のViewでも同じ趣旨のことは言えると思われます。

そして、また、この記事ではpaddingを題材にしていますが、背景色(background)の設定でも同じことが言えると思われます。

既に次のサイトでもお馴染みのCheckBoxに関する不都合です。
Android - Spacing between CheckBox and text
Is that is a bug with CheckBox in android?

CheckBoxに対してpaddingを施すと、CheckBoxの中の「文字列」と「チェックの画像」とが重なってしまう、という現象が発生します。

ここで言う、「paddingを施す」というのは、CheckBoxを定義するxmlでpaddingを施すことと、Javaのcodeでpaddingを施すことの両方を言います。

教科書どおりにCheckBoxを定義したxmlは次のとおりです。これだけだと何の問題もありません。
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    >
    <CheckBox
        android:id="@+id/CheckBox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello"
        >
    </CheckBox>
</LinearLayout>

上記xmlを使って次のJava codeを実行すると変になる。
public class CheckBoxActivity extends Activity{
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        CheckBox cb;
        cb = (CheckBox)findViewById(R.id.CheckBox);
        cb.setPadding(5,5,5,5);
    }
}

xmlにpaddingを入れても変になる
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    >
    <CheckBox
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello"
        android:padding="5dp"
        >
    </CheckBox>
</LinearLayout>

解決方法として、次の4通りが考えられます。
  1. CheckBoxに対してpaddingを施すことをやめる。(-_-;)
  2. 変になることを考慮に入れて、CheckBoxの左側にpaddingを多めに施す。
  3. 文字列はTextViewで表示する。
  4. CheckBoxの上位にLinearLayout等のViewGroupを設け、このViewGroupに対してpaddingを施す。
このバグは今後修正されるのでしょうか。この問題が提起されたのが2010年10月ですので、ずっと放置されたままですね。むむむ!
今後修正される可能性があるとするならば、上記2の方法を講じることは避けた方がよろしいです。
「修正なんかあり得る訳が無い!」という確信のある御仁は、上記2の方法でも良いかもしれません。そして、その確信は、今まさに、現実のものとして実現されています。この現実は、今後もずっと続くでしょう。この確信者は、先見の明があると言って良いかもしれません。(-_-;)

しかし、Androidの設計者を信奉する迷える子羊は、修正があることを疑いません。
そこで、上記3の方法を講じたxmlを次に掲げておきます。文字列の縦位置をチェックボックス画像の中央に位置付けるのが重要です。

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    >
    <CheckBox
        android:id="@+id/CheckBox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:padding="5dp"
        >
    </CheckBox>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/CheckBox"
        android:text="長い、長い、とても長い文字列が、ドンブラコ ドンブラコ と流れてきました。 TextView は処理をしきれずに落ちてしまいました。おしまい。"
        >
    </TextView>
</RelativeLayout>

Viewに対してpaddingを施すと変になるって記事は、既に書いておきました。この記事を読んで頂ければ、上記第4番目の対処方法が分かると思います。

0 件のコメント:

コメントを投稿