3

好みの画面でいくつかやりたいことがあります。

  1. タイトルにカスタムフォントを適用する
  2. 好みのアイコンを変更する
  3. 設定が選択された(またはタッチされた?)ときに背景色とフォント色を変更します

まず、CheckBoxPreferenceから始めました。カスタムフォントを適用するには、myCheckBoxPreferenceを作成します。

public class MyCheckBoxPreference extends CheckBoxPreference {
    public String robotoRegular = "fonts/Roboto-Regular.ttf";

    public MyCheckBoxPreference(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

    }

    public MyCheckBoxPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

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

    @Override
    protected View onCreateView(ViewGroup parent) {
        View view = super.onCreateView(parent);

        TextView titleView = (TextView) view.findViewById(android.R.id.title);
        Typeface tf = Typeface.createFromAsset(view.getContext().getAssets(), robotoRegular);
        titleView.setTypeface(tf);

        return view;

    }
}

そしてそれはうまくいきます。

チェックボックスの画像を変更するために、テーマを作成して適用しました。

私のstyles.xmlで

<style name="MyTheme" parent="Theme.Sherlock.Light">
    <item name="android:checkboxStyle">@style/MyCheckbox</item>
</style>
<style name="MyCheckbox" parent="android:Widget.CompoundButton.CheckBox">
    <item name="android:button">@drawable/btn_check</item>
</style>

好みのリストの背景色を変更するために、テーマも作成して適用しました。

<style name="MyTheme" parent="Theme.Sherlock.Light">
    <item name="android:checkboxStyle">@style/MyCheckbox</item>
    <item name="android:listViewStyle">@style/MyListView</item>
</style>

<style name="MyListView" parent="android:Widget.ListView.White">
    <item name="android:listSelector">@drawable/list_selector_background</item>
</style>

それもすべてうまくいきます。

しかし、フォントを動的に変更することに行き詰まりました。テーマを使ってみました

<style name="MyTheme" parent="Theme.Sherlock.Light">
    <item name="android:textColorPrimary">#717171</item>
    <item name="android:textColorPrimaryInverse">#FFFFFF</item>
    <item name="android:textColorPrimaryDisableOnly">#dcdcdc</item>    
</style>

しかし、動作しませんでした。

MyCheckBoxPreferenceでonTouchListenerを使用してみました。MyCheckBoxPreference.javaのonCreateViewは次のようになりました

@Override
protected View onCreateView(ViewGroup parent) {
    View view = super.onCreateView(parent);

    TextView titleView = (TextView) view.findViewById(android.R.id.title);
    Typeface tf = Typeface.createFromAsset(view.getContext().getAssets(), robotoRegular);
    titleView.setTypeface(tf);
    titleView.setTextColor(0xFF717171);

    view.setOnTouchListener(new View.OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {

            TextView titleView = (TextView) v.findViewById(android.R.id.title);
            int actionMasked = event.getActionMasked();
            switch (actionMasked)
            {
                case MotionEvent.ACTION_DOWN:
                {
                    titleView.setTextColor(0xFFFFFFFF);
                    break;
                }
                case MotionEvent.ACTION_UP:
                case MotionEvent.ACTION_CANCEL:
                {
                    titleView.setTextColor(0xFF717171);
                    break;
                }
                default:
                {
                    Log.d("MyCheckBoxPreference", "action" + event);
                }
            }

            return false;
        }
    });

    return view;

}

最初は動作しているように見えましたが、問題があります。アイテムに触れて指を別のアイテムに移動すると、フォントの色は白のままになります(0xFFFFFFFF)。そのコードでは、タイトルテキストの色が最初#717171にで設定されonCreateViewます。リスト項目を選択すると、onTouchで。を使用して色が変更されMotionEvent.ACTION_DOWNます。そして、アイテムの選択を解除しMotionEvent.ACTION_UPたりMotionEvent.ACTION_CANCEL、フォントの色をにしたりすると、期待していました#717171。ただし、項目の選択を解除すると、フォントの色が変更されますonCreateView。設定が変更されたため、システムはビューを再度作成したいと思います。

これは、設定が切り替えられた場合にのみ機能します。前述したように、あるアイテムに触れて指を別のアイテムに移動すると、設定ステータスが変更されMotionEvent.ACTION_CANCELずに到達しないため、フォントの色は白のままになります。

OnTouchListenerMotionEvent.ACTION_UPでtrueを返し、MotionEvent.ACTION_CANCEL到達したが、イベントを消費し、背景色が変更されない場合。

これが私の話です。

カスタムlist_item.xmlを作成してlistViewにスタイルを適用し、listview_item_selector.xmlでtextColorを設定しますが、設定ではデフォルトのListViewを使用するため、その方法がわかりません。

私は何をすべきか?すべての設定をカスタマイズする必要がありますか?どんな提案も素晴らしいでしょう。ありがとう。

4

0 に答える 0