web-dev-qa-db-ja.com

カスタム設定カテゴリの見出し

このように定義されたシンプルな設定画面があります

<PreferenceScreen xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <PreferenceCategory Android:title="Security">
        <CheckBoxPreference 
            Android:title="Require Pin on Start"
            Android:summary="Require pin to run the application"
            Android:key="@string/pref_require_pin"
            Android:defaultValue="false" />
    </PreferenceCategory>

    <PreferenceCategory Android:title="Settings">
        <ListPreference
           Android:title="History Age (in days)"
           Android:summary="Display items up to 30 days old"
           Android:key="@string/pref_history_days"
           Android:defaultValue="30"
           Android:entries="@array/days_list"
           Android:entryValues="@array/days_list"
           Android:dialogTitle="Select History Age"/>
    </PreferenceCategory>
</PreferenceScreen>

スタイルのセットアップが既にあり、アプリの他の場所で使用しています。

<style name="ListHeader">
    <item name="Android:textColor">#000000</item>
    <item name="Android:textStyle">bold</item>
    <item name="Android:textSize">12sp</item>
    <item name="Android:background">#cccccc</item>
    <item name="Android:paddingTop">6px</item>
    <item name="Android:paddingBottom">6px</item>
    <item name="Android:paddingLeft">12px</item>
</style>

ここに私の活動があります

public class PreferencesActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        addPreferencesFromResource(R.layout.preferences);
    }
}

PreferenceCategory見出しにカスタムスタイルを適用するにはどうすればよいですか?

30
Josh

Preference.Category スタイルを見てください:

<style name="Preference.Category">
    <item name="Android:layout">@Android:layout/preference_category</item>
   <item name="Android:shouldDisableView">false</item>
   <item name="Android:selectable">false</item>
</style>

preference_category.xmlファイルを見てみましょう。

<!-- Layout used for PreferenceCategory in a PreferenceActivity. -->
<TextView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    style="?android:attr/listSeparatorTextViewStyle"
    Android:id="@+Android:id/title"
/>

そのため、デフォルトAndroid Themeを拡張し、listSeparatorTextViewStyle値をListHeaderスタイルでオーバーライドするカスタムテーマを作成し、このテーマを適用する必要があります。 PreferenceActivityを拡張するアクティビティ。


方法は次のとおりです。

最初にstyles.xmlに次のコードを追加します:

<style name="PreferenceListHeader" 
       parent="@Android:style/Widget.TextView.ListSeparator">

    <item name="Android:textColor">#000000</item>
    <item name="Android:textStyle">bold</item>
    <item name="Android:textSize">12sp</item>
    <item name="Android:background">#cccccc</item>
    <item name="Android:paddingTop">6px</item>
    <item name="Android:paddingBottom">6px</item>
    <item name="Android:paddingLeft">12px</item>
</style>

<style name="Theme.Custom" parent="@Android:style/Theme">
    <item name="Android:listSeparatorTextViewStyle">@style/PreferenceListHeader</item>               
</style>

ThenAndroidManifest.xmlで、好みのアクティビティにテーマを追加します。

 <activity Android:name=".MyPreferencesActivity" 
           Android:theme="@style/Theme.Custom" 
           ... >
 ...
 </activity>

これがスクリーンショットです:

enter image description here

57
inazaruk

@inazarukは十分に答えを出しましたが、最近の更新以来、ADT 18 and above、エラーを与えるstylesにはいくつかの制限があります

Error retrieving parent for item: No resource found that matches the given name '@Android:style/Widget.TextView.ListSeparator'.

問題の原因と解決策についてはこのリンクを参照 。この投稿は理解のためのコードを提供していないので、ここでコードを提供しています

 <style name="Widget.TextView.ListSeparator" parent="@Android:style/Widget.TextView">
    <item name="Android:layout_width">match_parent</item>
    <item name="Android:layout_height">wrap_content</item>
    <item name="Android:textStyle">bold</item>
    <item name="Android:textSize">14sp</item>
    <item name="Android:gravity">center_vertical</item>
</style>

<style name="PreferenceListHeader" parent="Widget.TextView.ListSeparator">
    <item name="Android:textColor">#000000</item>
    <item name="Android:textStyle">bold</item>
    <item name="Android:textSize">18sp</item>
    <item name="Android:background">#cccccc</item>
    <item name="Android:paddingTop">6dp</item>
    <item name="Android:paddingBottom">6dp</item>
    <item name="Android:paddingLeft">12dp</item>
</style>

<style name="PreferenceScreen" parent="Android:Theme.NoTitleBar">
    <item name="Android:listSeparatorTextViewStyle">@style/PreferenceListHeader</item>
    <item name="Android:background">#F2B1DBF3</item>
</style>
20
Rohan Kandwal

Inazarukの答えで説明されているようにスタイルを設定するのは簡単ですが、見出しのテキストのスタイルを変更するだけで、まったく新しいレイアウトを指定する方法を提供しません(スタイルはlayoutアイテムを適用しません)。ただし、クラスを拡張する場合、簡単な解決策があります。

public class MyPreferenceCategory extends PreferenceCategory {

  public MyPreferenceCategory(Context context) {
    super(context);
    setLayoutResource(R.layout.yourlayout);
  }

  public MyPreferenceCategory(Context context, AttributeSet attrs) {
    super(context, attrs);
    setLayoutResource(R.layout.yourlayout);
  }
}

環境設定レイアウトを定義するときに、元のPreferenceCategoryの代わりにこれを使用します。

もちろん、テキストの上下の線、さまざまな背景、パディングなど、レイアウトには好きなものを含めることができます。たとえば、これはマテリアルデザインの色付きのサブタイトルと上の行を表示します。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:orientation="vertical" >
    <View
        Android:layout_width="match_parent"
        Android:layout_height="1dp"
        Android:layout_marginTop="6dp"
        Android:background="?attr/divider_color" />
    <TextView
        Android:id="@+Android:id/title"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:gravity="center_vertical"
        Android:padding="12dp"
        Android:textColor="?attr/colorAccent"
        Android:textSize="14sp"
        Android:textStyle="bold" />
</LinearLayout>
15
Gábor

Gáborの答えに似ていますが、PreferenceCategoryを拡張する代わりに、次のようにすることができます。1.カスタムレイアウトを作成します。preference_category.xmlという名前を付けました。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:orientation="vertical" >
<View
    Android:layout_width="match_parent"
    Android:layout_height="1dp"
    Android:layout_marginTop="6dp"
    Android:background="?attr/divider_color" />
<TextView
    Android:id="@+Android:id/title"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:gravity="center_vertical"
    Android:padding="12dp"
    Android:textColor="?attr/colorAccent"
    Android:textSize="14sp"
    Android:textStyle="bold" />
</LinearLayout>

重要:レイアウトには、このidのテキストビューが含まれている必要があります:Android:id = "@ + Android:id/title"

2.そして設定に次の行を追加します:Android:layout = "@ layout/preference_category"

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:Android="http://schemas.Android.com/apk/res/Android" >

<PreferenceCategory
    Android:key="Font_Settings"
    Android:title="@string/UISetting"
    Android:layout="@layout/preference_category" >
... //  other preferences in the category
</PreferenceCategory>
</PreferenceScreen>
10
Ali.DM