как вернуться к предыдущему PrefenenceScreen из вложенного PreferenceScreen без нажатия кнопки назад - PullRequest
3 голосов
/ 08 августа 2011

У меня есть многоуровневые настройки в программе с файлом XML. и я хочу знать, как вернуться на предыдущий уровень, не нажимая кнопку назад. Как написать код для реализации элемента в предпочтении, чтобы вернуть предыдущий уровень предпочтений.

Ответы [ 4 ]

1 голос
/ 03 ноября 2016

Вы можете смоделировать нажатие кнопки «назад»:

this.onBackPressed();

или

getActivity().onBackPressed();

если вы во фрагменте.

0 голосов
/ 01 сентября 2011

У меня была та же проблема, и я решил ее благодаря Xuelong и getDialog () , но без необходимости управлять onPreferenceTreeClick () .

  1. Вам необходимо сохранить экземпляр (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;       
        }
    }); 
}
}

Вот и все

Извините за презентацию, это мой первый пост на этом сайте.

Пока, парни

0 голосов
/ 05 ноября 2014

Основываясь на ответах Патриса и Сюэлонга, я сделал следующие функции, чтобы легко выполнить эту работу:

// 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 ()!).

0 голосов
/ 08 августа 2011

Я думаю, вы ищете что-то вроде этого

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

Но я не понял, что вы хотите вернуться к предыдущему экрану настроек, не нажимая кнопку «Назад». Вы можете пролить немного света на это ??

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...