如何从嵌套的PreferenceScreen返回到先前的PrefenenceScreen而不按后退按钮

时间:2011-08-08 11:06:17

标签: android preferences

我在程序中用xml文件编写了一个多级首选项。我想知道如何在不按后退按钮的情况下返回上一级别。 如何编写一些代码来优先实现项目以返回先前的首选项级别。

4 个答案:

答案 0 :(得分:1)

您可以模拟按下后退按钮:

this.onBackPressed();

getActivity().onBackPressed();

如果你是一个片段。

答案 1 :(得分:0)

我认为你正在寻找像这样的东西

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:key="NotifSettings" android:title="Notification Settings">
<PreferenceCategory android:title="Notification Settings">
    <CheckBoxPreference android:key="NotifyOption"
        android:title="Notification Status" android:defaultValue="true"
        android:summaryOn="Notifications are Enabled." android:summaryOff="Notifications are Disabled."
        android:persistent="true" />
    <Preference android:title="XXXX"
        android:dependency="NotifyOption" android:summary="xxxxxx"
        android:key="Xxx" />
</PreferenceCategory>

<PreferenceCategory android:title="YYYYY">
    <PreferenceScreen android:title="Configure Notifications"
        android:summary="yyyyy">

        <CheckBoxPreference android:key="aa"
            android:title="aaaaa" android:defaultValue="true"
            android:summary="aaaa" />

        <CheckBoxPreference android:key="bb"
            android:title="bbbbb" android:defaultValue="true"
            android:summary="bbbb." />

        ...             
        <ListPreference android:title="zzz"
            android:summary="zzzz" android:key="zz"
            android:defaultValue="0" android:entries="@array/OverDesc"
            android:entryValues="@array/OverValues" />
    </PreferenceScreen>
</PreferenceCategory>

<PreferenceCategory android:title="Alert Type">
    <CheckBoxPreference android:key="AlertVibr"
        android:title="Vibrate" android:defaultValue="true"
        android:summaryOn="Vibration Turned ON" android:summaryOff="Vibration Turned OFF" />

    <CheckBoxPreference android:key="AlertSound"
        android:title="Sound" android:defaultValue="true" android:summaryOn="Sound Turned ON"
        android:summaryOff="MUTE" />
</PreferenceCategory>

但我没有得到的是你想要返回上一个偏好屏幕,而不是按下后退按钮。你能否对此有所了解?

答案 2 :(得分:0)

由于Xuelong和 getDialog(),我遇到了同样的问题并解决了这个问题,但无需管理 onPreferenceTreeClick()

  1. 您需要保留要从中返回的PreferenceScreen的实例(myPreferenceScreen)
  2. 你必须给他一个XML密钥
  3. 使用findPreference(“MyPreferenceScreenKey”);
  4. 检索实例
  5. 必须返回后,请使用以下方法:myPreferenceScreen.getDialog()。dismiss()
  6. 然后你将从你来自哪里返回。

    这是一个例证:

    Xml文件:

    <?xml version="1.0" encoding="utf-8"?>
    
    <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <ListPreference android:key="contactList"/>     
    <PreferenceScreen android:title="My Sub Preference Screen ..."
            android:key="mySubScreenKey">
        <EditTextPreference android:key="foo1"/>    
    </PreferenceScreen>
    </PreferenceScreen>
    

    Java文件:

    public class ParanoidPreferenceManager extends PreferenceActivity {
     ListPreference contactList;
     EditTextPreference foo1;
     PreferenceScreen mySubScreenKey;
    
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
    
         //Load XML preference file
         addPreferencesFromResource(R.xml.preferences); 
    
    
        contactList = (ListPreference) findPreference("contactList");
        foo1=  (EditTextPreference) findPreference("foo1");
        screenContact = (PreferenceScreen) findPreference("screenAddContact");
    
        foo1.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
    
            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                    mySubScreenKey.getDialog().dismiss();
                    return false;       
            }
        }); 
    }
    }
    

    就是这样

    很抱歉,这是我在这个网站上的第一篇文章。

    Bye dudes

答案 3 :(得分:0)

在Patrice&Xuelong的答案的基础上,我已经做了以下功能来轻松完成这项工作:

// Refresh the content of a PreferenceScreen by simulating a click (thus it will call the refresh code if it's contained inside the click callback)
private void refreshPreferenceScreenByClick(String prefScreenName) {
    // Refresh preference screen (given by its name) by calling the click callback
    PreferenceScreen prefScreen = (PreferenceScreen) findPreference(prefScreenName);
    Preference.OnPreferenceClickListener click_callback = prefScreen.getOnPreferenceClickListener();
    click_callback.onPreferenceClick(prefScreen);
}

// Close the current PreferenceScreen (or any given the name)
// Useful to go back to the previous PreferenceScreen when constructing dynamically nested submenus.
private void closePreferenceScreen(String prefScreenName) {
    PreferenceScreen prefScreen = (PreferenceScreen) findPreference(prefScreenName);
    prefScreen.getDialog().dismiss();
}

首先,如果您在子菜单中执行的操作定义了父菜单上显示的内容(例如,在音乐应用程序中:子菜单允许添加新乐器,而父菜单显示添加的乐器列表),您首先要有要拨打refreshPreferenceScreenByClick("parentPreferenceScreen"),然后返回父菜单,您只需拨打closePreferenceScreen("currentPreferenceScreen")即可关闭当前子菜单。

或者,如果您只想以编程方式打开子菜单,可以使用此处的openPreference函数(已测试且效果很好):https://stackoverflow.com/a/4869034/1121352

注意:不要使用openPreference()函数返回到父PreferenceScreen,因为经过几次迭代后,您将获得堆栈溢出,您的应用程序将崩溃(因为Android将在内存中保留所有以前菜单的历史记录,包括你通过openPreference()打开的那些!)。