3

我有以下偏好片段 xml:

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

    <PreferenceScreen
        android:order="1"
        android:summary="Sound settings"
        android:title="Sound"
        android:widgetLayout="@layout/preference_switch_sound" >
        <intent
            android:action="android.intent.action.VIEW"
            android:targetClass="com.test.SoundPreferencesActivity"
            android:targetPackage="com.test" />
    </PreferenceScreen>

</PreferenceScreen>

还有我上面指向的声音开关 widgetLayout:

<?xml version="1.0" encoding="utf-8"?>
<Switch xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/soundSwitchWidget"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:padding="16dip"
    android:focusable="false"
    android:clickable="true" />

我的问题是我需要在代码中获取开关,以便我可以附加 onClickListener。

我尝试在我的偏好活动中找到该视图:

public class PublicPreferencesActivity extends PreferenceActivity {

... 

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getFragmentManager().beginTransaction().replace(android.R.id.content, preference).commit();
            Switch s = (Switch) findViewById(R.id.soundSwitchWidget);
                // I always get null here
    }

}

我也在我的片段中尝试过:

public static class PublicPreferenceFragment extends PreferenceFragmentSummary  {       
    @Override
    public void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.publicpreferences);
                    Switch s = (Switch) findViewById(R.id.soundSwitchWidget);
                    // switch is null here too

    }
}

如何以编程方式访问我放在首选项屏幕中的开关?

编辑: 有一个关于为什么我不使用 SwitchPreference 的问题。基本上我希望能够使用开关打开/关闭声音,但如果他们单击首选项(不是在开关上,而是在标题上),也能够切换到新的 PreferenceScreen。我尝试使用 SwitchPreference,但是当我单击文本时,它会切换开关并将我发送到 PreferenceScreen,而不仅仅是将我发送到 PreferenceScreen。

我正在尝试模仿主要设置中的 wifi 行为。IE 你可以从顶层打开/关闭开关,也可以点击文本访问更详细的屏幕。

4

2 回答 2

2

您没有使用 a 的任何特殊原因SwitchPreference

<SwitchPreference
    android:order="1"
    android:summary="Sound settings"
    android:title="Sound" >
   <intent
        android:action="android.intent.action.VIEW"
        android:targetClass="com.test.SoundPreferencesActivity"
        android:targetPackage="com.test" />
</SwitchPreference>

但是就调用View.findViewByIdyour而言Switch,您需要 subclass Preference,因为您不能 subclass PreferenceScreen,然后从那里覆盖Preference.bindView并初始化它。

于 2014-03-23T06:31:51.337 回答
-1

Fragment 的 onCreate() 函数不应创建任何视图(这对所有类型的 Fragment 都是正确的)。

无论需要如何,要访问 PreferenceFragment 的视图,都必须重写 onCreateView()。请参阅首选项 ListView 填充删除示例:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = super.onCreateView(inflater, container, savedInstanceState);

    if (null != view) {
        ListView lv = (ListView) view.findViewById(android.R.id.list);
        if (null != lv)
            lv.setPadding(0, 0, 0, 0);
    }

    return view;
}
于 2015-10-23T19:06:08.283 回答