【问题标题】:how to return to the previous PrefenenceScreen from nested PreferenceScreen without press the back button如何在不按后退按钮的情况下从嵌套的 PreferenceScreen 返回到上一个 PrefenenceScreen
【发布时间】:2011-08-08 11:06:17
【问题描述】:

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

【问题讨论】:

    标签: android preferences


    【解决方案1】:

    我遇到了同样的问题,感谢雪龙和getDialog()解决了,但不需要管理onPreferenceTreeClick()

    1. 您需要保留一个要从中返回的 PreferenceScreen 的实例 (myPreferenceScreen)
    2. 你必须给他一个 XML 键
    3. 使用 findPreference("MyPreferenceScreenKey"); 检索实例;
    4. 一旦你必须返回,使用这个方法:myPreferenceScreen.getDialog().dismiss()

    然后你会从你原来的地方回来。

    这是一个经过净化的例子:

    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;       
            }
        }); 
    }
    }
    

    就是这样

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

    再见,伙计们

    【讨论】:

    • 是的!做得好。感谢分享。这是一个有一点偏好项和较少级别的preferenceActivity的好方法。在我的应用程序中,我管理了一个大型 PreferenceActivity 并且它有很多返回 Preference,然后在 onPreferenceTreeClick() 中编写代码是使每个返回项工作的好方法,而无需为每个 Preferences 编写不同的 Listener。哈,这个问题也是我在这里发布的第一个问题。哈哈~~
    【解决方案2】:

    在帕特里斯和雪龙的回答的基础上,我制作了以下功能来轻松完成这项工作:

    // 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() 打开的那些!)。

    【讨论】:

      【解决方案3】:

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

      this.onBackPressed();
      

      getActivity().onBackPressed();
      

      如果你在一个片段中。

      【讨论】:

        【解决方案4】:

        我认为您正在寻找类似的东西

        <?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>
        

        但我没有得到的是您想要返回上一个首选项屏幕,而不按返回按钮。你能更详细地说明一下吗?

        【讨论】:

        • 啊...我在多层次中编写PreferencesActiviry,例如单击Preferences列表中的第一项,它将变成另一个新的Preference menu..就像OS中的文件夹.然后,如何返回父 Preference 菜单,就像返回 OS 中的父文件夹一样。我很抱歉我的泳池英语..
        • 我找到了解决方案,只需在 onPreferenceTreeClick 方法中编写 getDialog 的代码,然后调用对话框的解除方法然后它就会返回(例如在您的 xml 代码中,在 Configure Notifications 菜单中转到主preferenceScreen)。
        • 哦,谢谢。我遇到一个新问题,我在这里发帖link
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-02-19
        • 1970-01-01
        • 2011-08-29
        • 1970-01-01
        • 1970-01-01
        • 2016-10-02
        相关资源
        最近更新 更多