CheckBoxPreference with own layout

woyaru picture woyaru · Aug 17, 2011 · Viewed 9.4k times · Source

I have PreferenceScreen with some PreferenceCheckBoxes. I want to change the textColor and textSize for title and summary and the images for the CheckBox checked and uncheckes. So I am using android:layout to change this attributes.

My ChceckBoxPreference:

<CheckBoxPreference
    android:layout="@layout/preference_checkbox"
    android:key="temp"
    android:title="@string/title"
    android:summary="@string/summary"
    android:defaultValue="true" 
/>

When I use android:widgetLayout it looks strange. And this is my preference_checkbox.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="10dp"
>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="fill_parent"
    android:layout_alignParentLeft="true"
    android:layout_marginLeft="10dp"
>
<TextView 
    android:id="@+android:id/title"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:textColor="@color/gray"
    android:textSize="20sp"     
    />
<TextView 
    android:id="@+android:id/summary"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:textColor="@color/gray"
    android:textSize="14sp"
    />
</LinearLayout>
<CheckBox
    android:id="@+android:id/checkbox"
    android:layout_width="wrap_content" 
    android:layout_height="fill_parent" 
    android:layout_alignParentRight="true"
    android:layout_marginRight="10dp"
/>  
</RelativeLayout>     

Title with id @+android:id/title and summary with @+android:id/summary are showing correct values. However the checkbox despite of default value and id @+android:id/checkbox is not working properly. It isn't showing correct value and I can't change the value kept in preferences. Without using any layout, I can change value of checkbox by touch at the whole CheckBoxPreference. But now (with my layout) I can change value of checkbox only by touch on this checkbox. How can I make layout for CheckBoxPreference in properly way with all the functionalities?

Answer

asish picture asish · Feb 9, 2012

Try this as preference_checkbox.xml

<?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">

<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"
        android:textColor="#FF0000" />

    <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: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>