gpt4 book ai didi

Android SwitchPreferences在PreferenceActivity中一起变化

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:26:39 24 4
gpt4 key购买 nike

我在我的 Android 应用程序中使用 SwitchPreference,发现了一些很奇怪的东西。 preference中有多个SwitchPreference。

当我使用 PreferenceActivity 的默认布局时,一切都运行良好。但是在我将自定义布局设置为首选项 Activity 后,当您单击其中任何一个时,这些开关开始一起变化。我正在基于 arm 的平板电脑上对其进行测试。我还在我的 Android 手机上对其进行了测试,它的工作原理是一样的。

它是如何发生的!

这是我的自定义布局(setting.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="match_parent"
android:orientation="vertical" >

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >

<Button
android:id="@+id/button1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Button" />

<Button
android:id="@+id/button2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Button" />
</LinearLayout>

<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</ListView>

</LinearLayout>

和首选项屏幕

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<SwitchPreference
android:key="switch1"
android:summary="This is switch 1"
android:title="Switch 1" />
<SwitchPreference
android:key="switch2"
android:summary="This is switch 2"
android:title="Switch 2" />
</PreferenceScreen>

在代码中,我只是设置了自定义布局

public class SettingsActivity extends PreferenceActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.setting);
}

@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);

setupSimplePreferencesScreen();
}

private void setupSimplePreferencesScreen() {
addPreferencesFromResource(R.xml.pref_general);
}
}

这是首选项的屏幕截图,两个开关总是同时改变,无论你点击它们中的每一个。 The screenshot of the preference

最佳答案

似乎SwitchPreference的onBindView会使用其他Switch View 作为参数。

这是一个bug issue在 Google Code 的 Android 项目中。 不是这个问题,但类似的是,这两个描述开关 View 将根据其他开关的状态进行操作。

所以我找到了两种解决问题的方法:

  1. 如果屏幕上有多个 bool 值偏好设置,请使用 CheckBoxPreference
  2. 使用这个解决方法

    public class CustomSwitchPreference extends SwitchPreference {

    /**
    * Construct a new SwitchPreference with the given style options.
    *
    * @param context The Context that will style this preference
    * @param attrs Style attributes that differ from the default
    * @param defStyle Theme attribute defining the default style options
    */
    public CustomSwitchPreference(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    }

    /**
    * Construct a new SwitchPreference with the given style options.
    *
    * @param context The Context that will style this preference
    * @param attrs Style attributes that differ from the default
    */
    public CustomSwitchPreference(Context context, AttributeSet attrs) {
    super(context, attrs);
    }

    /**
    * Construct a new SwitchPreference with default style options.
    *
    * @param context The Context that will style this preference
    */
    public CustomSwitchPreference(Context context) {
    super(context, null);
    }

    @Override
    protected void onBindView(View view) {
    // Clean listener before invoke SwitchPreference.onBindView
    ViewGroup viewGroup= (ViewGroup)view;
    clearListenerInViewGroup(viewGroup);
    super.onBindView(view);
    }

    /**
    * Clear listener in Switch for specify ViewGroup.
    *
    * @param viewGroup The ViewGroup that will need to clear the listener.
    */
    private void clearListenerInViewGroup(ViewGroup viewGroup) {
    if (null == viewGroup) {
    return;
    }

    int count = viewGroup.getChildCount();
    for(int n = 0; n < count; ++n) {
    View childView = viewGroup.getChildAt(n);
    if(childView instanceof Switch) {
    final Switch switchView = (Switch) childView;
    switchView.setOnCheckedChangeListener(null);
    return;
    } else if (childView instanceof ViewGroup){
    ViewGroup childGroup = (ViewGroup)childView;
    clearListenerInViewGroup(childGroup);
    }
    }
    }

    }

我已经测试了这两种解决方案。它们有效。

关于Android SwitchPreferences在PreferenceActivity中一起变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20906338/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com