web-dev-qa-db-ja.com

Android設定フラグメントのテキストの色

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);

        }
    }

}
19
AlexIIP

preference.xmlTextViewのレイアウト)の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" />

したがって、テーマのtextAppearanceLargetextColorSecondaryをオーバーライドして色を変更できるように見えます。次に例を示します。

<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>
12
Jason Robinson

そのための簡単で明確な方法は次のように思います。

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);
6
Andrey

ちょうど仕事を成し遂げる答えを見つけました。

このファイルは、設定リスト項目のデフォルトのレイアウトです。

<?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);
}

これらの回答に基づいて:

設定用のカスタムレイアウトの作成

PreferenceScreenにボタンを追加する方法

Android:設定でマージン/パディングを調整する方法?

5
Saito Mea

私には、上記の方法はどれもうまくいきませんでした。私が使用した種類の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 はそのパスを示しました:

2
yshahak

これで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>
1
Paulo Matuki

コメントや賛成投票を行うのに十分な担当者がいませんが、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>

少なくともこれがなぜなのか説明できない場合は、テキストの色を変更しようとしたときと同じ問題が発生する可能性があります。

1
Woodstown

Compatライブラリを使用している場合は、以下を追加します。

<item name="colorAccent">#ff0000</item>

あなたのスタイルに

0
Oded Breiner