在Android偏好中应用自定义主题

时间:2013-01-16 15:20:09

标签: android android-listview themes preference

我想在我的偏好屏幕上做一些事情。

  1. 将自定义字体应用于标题
  2. 更改一些偏好图标
  3. 选择(或触摸?)
  4. 时更改背景颜色和字体颜色

    首先,我从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_UPMotionEvent.ACTION_CANCEL时,将字体颜色设为#717171。但是,当我取消选择该项目时,onCreateView中的字体颜色会发生变化。我认为因为首选项已更改,系统需要再次创建视图。

    仅在切换首选项时才有效。正如我上面提到的那样,当我触摸某个项目并将我的手指移动到另一个项目时,字体颜色保持白色,因为首选项状态保持不变并且未达到MotionEvent.ACTION_CANCEL

    如果我在OnTouchListener中返回true MotionEvent.ACTION_UP并且已到达MotionEvent.ACTION_CANCEL,但它会消耗该事件并且背景颜色不会更改。

    这是我来到这里的故事。

    我通过自定义 list_item.xml 在ListView中应用样式,并使用我的 listview_item_selector.xml 设置textColor但是在首选项中,它使用默认的ListView,所以我不# 39;不知道怎么做。

    我该怎么办?我是否必须自定义所有首选项? 任何建议都会很棒。感谢。

0 个答案:

没有答案