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)。在该代码中,标题文本颜色首先设置#717171onCreateView. When the list item is selected the color changed in onTouch with MotionEvent.ACTION_DOWN. 当我取消选择该项目MotionEvent.ACTION_UPMotionEvent.ACTION_CANCEL将字体颜色设置为#717171. 但是,当我取消选择该项目时,字体颜色在onCreateView. 我认为因为偏好发生了变化,系统想要再次创建视图。

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

如果我在 OnTouchListener 中返回 trueMotionEvent.ACTION_UPMotionEvent.ACTION_CANCEL到达但它消耗了事件并且背景颜色不会改变。

这是我来到这里的故事。

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

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

4

0 回答 0