Android Can';t在ListView焦点问题的父布局内切换子视图 问题

Android Can';t在ListView焦点问题的父布局内切换子视图 问题,android,android-listview,android-preferences,Android,Android Listview,Android Preferences,gif图像说明了一切。我有一个列表视图,其中每个项目都是一个线性布局。此父布局包含一些文本和一个复选框 我希望复选框在按下LinearLayout时自动切换。但事实并非如此——见下文: LinearLayout可自行操作,无需切换复选框。我可以手动更改复选框状态,但这对父状态没有影响 一些代码 我的孩子复选框: <CheckBox xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id

gif图像说明了一切。我有一个
列表视图
,其中每个项目都是一个
线性布局
。此父布局包含一些文本和一个
复选框

我希望复选框在按下
LinearLayout
时自动切换。但事实并非如此——见下文:

LinearLayout
可自行操作,无需切换复选框。我可以手动更改复选框状态,但这对父状态没有影响

一些代码 我的孩子
复选框

<CheckBox xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/checkbox"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:focusable="false"
    android:clickable="true"
    android:background="@null"
    android:duplicateParentState="true"
    />
我试过的东西 当我在某处阅读时,
复选框
必须是不可聚焦的。我也尝试将其设置为不可点击的,因为我不希望有两个单独的点击区域-我希望当我点击整个
线性布局时,框可以切换。结果是,我仍然可以单击
LinearLayout
,但它对复选框没有影响

我也一直在玩弄
android:duplicateParentState
(在child上)和
android:addStatesFromChildren
(在parent上),但我可能没有找到正确的状态组合

我能做什么?我真的被这件事缠住了

你可能需要知道的事情 例如,为什么我不能设置一个侦听器

我正在扩展
ActionBarActivity
,并且有一个
PreferenceFragment

我对列表中的项目没有太多的运行时控制,因为它们是由
首选项片段
处理的。根据我的xml/preferences.xml,listview中的每一行都会膨胀,我对此不做任何处理。与任何首选项列表一样,每个项都有自己的本机侦听器来编辑my
SharedReference
。您可以在下面看到单击的项以解锁依赖于它的首选项。同样,我对此不做任何处理,也不能仅仅为了切换复选框和开关而覆盖自定义行为

我只是为单个常规首选项行设置了一个手工布局(我们正在讨论的布局)(这里有一个适当的样式属性)。因此,我可以同时控制行容器和复选框的XML属性,但从java中控制不了多少。我想我需要一个XML解决方案。

使线性布局“可单击”,然后在该布局的
onClickListener
中,让它切换复选框
设置选中状态


如果你有两个“不同的”重叠的点击“区域”来完成相同的功能,这真的不重要。如果LinearLayout在事件传播到其子级之前就使用了该事件(它应该这样做),那么您就永远不会有问题。

我提出的解决方案与首选项严格相关,为了简单起见,我最初想将其排除在外

假设我只有两个复选框,我所做的是为首选项状态更改设置侦听器:

        listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
            @Override
            public void onSharedPreferenceChanged(SharedPreferences defaultSP, String key) {

                if (key.equals(PREF_CHECKBOX1)) {
                    CheckBox s = (CheckBox) getActivity().findViewById(R.id.checkbox);
                    s.setChecked(defaultSP.getBoolean(key, false));
                }
                if (key.equals(PREF_CHECKBOX2)) {
                    CheckBox s2 = (CheckBox) getActivity().findViewById(R.id.checkbox2);
                    s2.setChecked(defaultSP.getBoolean(key, false));
                }
然后,我在两个单独的布局文件中设置了两个不同的复选框小部件,即非可聚焦的
和非可点击的
,它们的ID各不相同:

布局/checkbox1.xml

<CheckBox xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/checkbox"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:focusable="false"
    android:clickable="false"
    />
正如我所希望的那样,我不能停留在单一的共享小部件布局上,因为监听器中的
findviewbyd(R.id.checkbox)
只返回两个小部件中的一个,与按下的项目和键值无关


非常糟糕,但我找不到其他任何东西。

对不起,我没有
线性布局的侦听器。这些是首选项,列表由preferences.xml中的项填充(这不是我们要讨论的)。最右边的小部件可以是一个
复选框
,或者一个
开关
,对于其他类型的首选项,甚至可以是空的。此外,单击事件由PreferenceFragment处理,并相应地设置SharedReferences(),这是我无法手动完成的。我处理的布局是定义单个首选项行的布局,并根据preferences.xml由我的
PreferenceFragment
膨胀。我无法覆盖单行的实际侦听器。您需要发布更多代码。一般来说,您可以单击线性布局并添加
onClickListener
,但是如果您使用
PreferenceFragment
,您应该仍然能够在java中获取
id
,并为其设置和
onClickListener
,我可以,但这会覆盖本机侦听器。如图所示,单击会设置项目首选项,并解锁上面的其他首选项(与项目相关)。我不能控制这种行为。如果我设置了自己的侦听器,我可以切换复选框,但该项将失去更改首选项等功能(这将非常烦人,这就是PreferenceFragment的用途)。我希望有一个XML解决方案。
<CheckBox xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/checkbox"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:focusable="false"
    android:clickable="false"
    />
<CheckBox xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/checkbox2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:focusable="false"
    android:clickable="false"
    />
    <CheckBoxPreference
        android:key="..."
        android:title="@..."
        android:defaultValue="false" 
        android:widgetLayout="@layout/checkbox1" />

    <CheckBoxPreference
        android:key="..."
        android:title="@..."
        android:defaultValue="false"
        android:widgetLayout="@layout/checkbox2" />