Android設定フラグメントでテキストの色を変更したいのですが、現在カスタムテーマを使用してチェックボックスの画像、背景、onClickの強調表示を変更しています。テキストの色以外にもすべてうまくいきます...デフォルトのテーマを使いたくありません。独自のテーマを用意したいので、見た目はすべて望みどおりですが、テキストの色を変更するだけです。誰か助けてください。
styles.xml
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:Android="http://schemas.Android.com/apk/res/Android">
<style name="selectedTextStyle">
<item name="Android:textSize">18sp</item>
</style>
<style name="buttonTextStyle">
<item name="Android:textSize">20sp</item>
</style>
<style name="PreferencesTheme" >
<item name="Android:windowBackground">@drawable/lists_background</item>
<item name="Android:listViewStyle">@style/listViewPrefs</item>
<item name="Android:checkboxStyle">@style/MyCheckbox</item>
</style>
<style name="MyTextAppearance" parent="@Android:style/TextAppearance">
<item name="Android:textColor">@color/black</item>
</style>
<style name="listViewPrefs" parent="@Android:Widget.ListView">
<item name="Android:listSelector">@layout/list_selector_master</item>
<item name="Android:textAppearance">@style/MyTextAppearance</item>
</style>
<style name="MyCheckbox" parent="Android:Widget.CompoundButton.CheckBox">
<item name="Android:button">@drawable/btn_check</item>
</style>
</resources>
マニフェスト:
<activity
Android:name="com.package.SettingsActivity"
Android:theme="@style/PreferencesTheme"
Android:configChanges="keyboard|orientation" >
</activity>
アクティビティ:
import Android.app.Activity;
import Android.os.Bundle;
import Android.preference.PreferenceFragment;
public class SettingsActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Display the fragment as the main content.
getFragmentManager().beginTransaction()
.replace(Android.R.id.content, new SettingsFragment())
.commit();
}
public static class SettingsFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.preferences);
}
}
}
preference.xml (TextView
のレイアウト)の2つのPreference
オブジェクトを次に示します。
<TextView Android:id="@+Android:id/title"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:singleLine="true"
Android:textAppearance="?android:attr/textAppearanceLarge"
Android:ellipsize="Marquee"
Android:fadingEdge="horizontal" />
<TextView Android:id="@+Android:id/summary"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_below="@Android:id/title"
Android:layout_alignLeft="@Android:id/title"
Android:textAppearance="?android:attr/textAppearanceSmall"
Android:textColor="?android:attr/textColorSecondary"
Android:maxLines="4" />
したがって、テーマのtextAppearanceLarge
とtextColorSecondary
をオーバーライドして色を変更できるように見えます。次に例を示します。
<style name="AppTheme">
<item name="Android:textAppearanceLarge">@style/MyTextAppearance</item>
<item name="Android:checkboxStyle">@style/MyCheckBox</item>
</style>
<style name="MyCheckBox" parent="@Android:style/Widget.CompoundButton.CheckBox">
<item name="Android:button">@Android:drawable/btn_star</item>
</style>
<style name="MyTextAppearance" parent="@Android:style/TextAppearance.Large">
<item name="Android:textColor">#ff0000</item>
</style>
そのための簡単で明確な方法は次のように思います。
res/values/styles.xml
<style name="SettingsFragmentStyle">
<item name="Android:textColorSecondary">#222</item>
<item name="Android:textColor">#CCC</item>
<item name="Android:background">#999</item>
...
</style>
OnCreate内にPreferenceFragmentサブクラスを含むアクティビティ内:
setTheme(R.style.SettingsFragmentStyle);
ちょうど仕事を成し遂げる答えを見つけました。
このファイルは、設定リスト項目のデフォルトのレイアウトです。
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2006 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.Apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!-- Layout for a Preference in a PreferenceActivity. The
Preference is able to place a specific widget for its particular
type in the "widget_frame" layout. -->
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:minHeight="?android:attr/listPreferredItemHeight"
Android:gravity="center_vertical"
Android:paddingRight="?android:attr/scrollbarSize"
Android:background="?android:attr/selectableItemBackground" >
<ImageView
Android:id="@+Android:id/icon"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_gravity="center"
/>
<RelativeLayout
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_marginLeft="15dip"
Android:layout_marginRight="6dip"
Android:layout_marginTop="6dip"
Android:layout_marginBottom="6dip"
Android:layout_weight="1">
<TextView Android:id="@+Android:id/title"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:singleLine="true"
Android:textAppearance="?android:attr/textAppearanceLarge"
Android:ellipsize="Marquee"
Android:fadingEdge="horizontal" />
<TextView Android:id="@+Android:id/summary"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_below="@Android:id/title"
Android:layout_alignLeft="@Android:id/title"
Android:textAppearance="?android:attr/textAppearanceSmall"
Android:textColor="?android:attr/textColorSecondary"
Android:maxLines="4" />
</RelativeLayout>
<!-- Preference should place its actual preference widget here. -->
<LinearLayout Android:id="@+Android:id/widget_frame"
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
Android:gravity="center_vertical"
Android:orientation="vertical" />
</LinearLayout>
これをベースとして使用して、独自のカスタムレイアウトを作成できます。このレイアウトは、このように各設定内で適用する必要があります
<Preference Android:key="somekey"
Android:title="Title"
Android:summary="Summary"
Android:layout="@layout/custom_preference_layout"/>
リスト外のレイアウト全体を変更できます。次のように設定が入力されるリストビューを含むレイアウトファイルが必要です。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:orientation="vertical" >
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="Something" />
<ListView
Android:id="@Android:id/list"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent" />
</LinearLayout>
PreferenceFragment
のデフォルトのレイアウトをオーバーライドするには、メソッドonCreateView
をオーバーライドし、インフレートされたビューを変更します。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.custom_options_layout, null);
}
これらの回答に基づいて:
私には、上記の方法はどれもうまくいきませんでした。私が使用した種類のPreferncesクラス、私の場合はCheckBoxPreferncesを拡張してしまいました。
public class MyPreferenceCheckBox extends CheckBoxPreference {
public MyPreferenceCheckBox(Context context) {
super(context);
}
public MyPreferenceCheckBox(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyPreferenceCheckBox(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected View onCreateView(ViewGroup parent) {
ViewGroup root = (ViewGroup) super.onCreateView(parent);
((TextView)root.findViewById(Android.R.id.title)).setTextColor(parent.getResources().getColor(R.color.red));
((TextView)root.findViewById(Android.R.id.summary)).setTextColor(parent.getResources().getColor(R.color.red));
return root;
}
}
そして、prefs.xmlでの使用:
<com.my.package.name.MyPreferenceCheckBox
Android:title="@string/my_title"
Android:defaultValue="true"
Android:key="@string/my_key"
Android:summary="On/Off" />
この answer はそのパスを示しました:
これでPreferenceFragmentのテキストの色を変更することができました:
styles.xml
<resources>
<style name="SettingsTheme" parent="Android:Theme.Holo">
<item name="Android:textColorPrimary">@color/light_blue_font_color</item>
<item name="Android:textColorSecondary">@color/white_font_color</item>
<item name="Android:textColorTertiary">@color/white_font_color</item>
</style>
</resources>
colors.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="light_blue_font_color">#33b5e5 </color>
<color name="white_font_color">#ffffff </color>
</resources>
AndroidManifest.xml
<activity
Android:name="xx.yy.zz.SettingsActivity"
Android:theme="@style/SettingsTheme" >
</activity>
コメントや賛成投票を行うのに十分な担当者がいませんが、TextAppearanceMediumに関するmharperの提案がテキストの色の変更に関しても機能することを追加したいと思います。誰かがこれがなぜであるか知っているなら、それを説明してください。
それで、受け入れられた答えを次のように調整してください:
<style name="AppTheme">
<item name="Android:textAppearanceMedium">@style/MyTextAppearance</item>
</style>
<style name="MyTextAppearance" parent="@Android:style/TextAppearance.Medium">
<item name="Android:textColor">#ff0000</item>
</style>
少なくともこれがなぜなのか説明できない場合は、テキストの色を変更しようとしたときと同じ問題が発生する可能性があります。
Compatライブラリを使用している場合は、以下を追加します。
<item name="colorAccent">#ff0000</item>
あなたのスタイルに