好みの画面でいくつかやりたいことがあります。
- タイトルにカスタムフォントを適用する
- 好みのアイコンを変更する
- 設定が選択された(またはタッチされた?)ときに背景色とフォント色を変更します
まず、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を使用するため、その方法がわかりません。
私は何をすべきか?すべての設定をカスタマイズする必要がありますか?どんな提案も素晴らしいでしょう。ありがとう。