Основываясь на ответах Патриса и Сюэлонга, я сделал следующие функции, чтобы легко выполнить эту работу:
// 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 ()!).