CheckBoxPreference with own layout
Asked Answered
S

1

12

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?

Saxophone answered 17/8, 2011 at 14:32 Comment(3)
See #3569912, set clickable and focusable to false for your checkboxAcrid
@Acrid the OP is talking about changing the entire layout behind the preference, the solution you pointed out is only about the checkboxVerwoerd
devisnik's answer should be the correct one. Those settings are required to effect a change in the preference value.Fenestrated
B
30

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>
Boar answered 9/2, 2012 at 6:32 Comment(2)
Source of this snippet: android.googlesource.com/platform/frameworks/base/+/refs/heads/… (ashish added color customization of course)Verwoerd
@ashish It's been a long time since you posted this answer but I'm stuck somewhere. I'm getting an error in my xml saying "Cannot resolve symbol @+android:id/title". Can you help me figure out the reason for the same..Jarboe

© 2022 - 2024 — McMap. All rights reserved.