Показать вверх-кнопку в действииBar в предпочтениях подэкрана

Я реализовал свои предпочтения, как показано в официальных рекомендациях.

У меня есть PreferenceActivity, который создает PreferenceFragment следующим образом:

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Bundle extras = getIntent().getExtras(); if (extras != null) { Bundle bundle = new Bundle(); _widgetID = extras.getInt(GlobalSettings.EXTRA_WIDGET_ID); bundle.putInt(GlobalSettings.EXTRA_WIDGET_ID, _widgetID); WidgetSettingsFragment fragment = new WidgetSettingsFragment(); fragment.setArguments(bundle); getFragmentManager().beginTransaction().replace(android.R.id.content, fragment).commit(); } } 

PreferenceFragment загружает предпочтения из ресурсов, и они содержат подэкраны предпочтений следующим образом:

 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <!-- opens a subscreen of settings --> <PreferenceScreen android:key="button_voicemail_category_key" android:title="@string/voicemail" android:persistent="false"> <ListPreference android:key="button_voicemail_provider_key" android:title="@string/voicemail_provider" ... /> <!-- opens another nested subscreen --> <PreferenceScreen android:key="button_voicemail_setting_key" android:title="@string/voicemail_settings" android:persistent="false"> ... </PreferenceScreen> <RingtonePreference android:key="button_voicemail_ringtone_key" android:title="@string/voicemail_ringtone_title" android:ringtoneType="notification" ... /> ... </PreferenceScreen> ... </PreferenceScreen> 

Пока это хорошо работает, но теперь я хочу иметь up-Button в actionBar, когда будет показан подэкран настроек. Любая идея, как это сделать?

Я попытался установить setDisplayHomeAsUpEnabled(true) в свою активность, но затем кнопка вверх отображается только в основных настройках (где это не должно), а не в подэкране.

Мне интересно, что даже в официальных документах подэкран отображается без активной кнопки «вверх»: Настройка подэкранов

Ссылка на документы: Настройки

Любая помощь действительно приветствуется

Solutions Collecting From Web of "Показать вверх-кнопку в действииBar в предпочтениях подэкрана"

Наконец я получил его на работу: D. Это довольно хаки, но это работает.

Проблема в том, что использование подэкранов в xml-макетах приводит к некоторой «магии кода». Для подэкрана запускается новое действие / диалог, и у вас нет прямого доступа к нему.

Чтобы получить доступ к панели действий и OnClickListener дома / кнопки вверх, вам нужно получить ссылку на ваш PreferenceScreen и получить его родительский диалог, чтобы получить доступ к панели действий и кнопке home / up.

Вот как это делается внутри моего PreferenceFragment:

  @Override public void onCreate(Bundle savedInstanceState) { ... final PreferenceScreen preferenceScreen = (PreferenceScreen) findPreference(getString(R.string.keyPrefScreenDynamicWidgetDetails)); preferenceScreen.setOnPreferenceClickListener(new OnPreferenceClickListener() { public boolean onPreferenceClick(Preference preference) { preferenceScreen.getDialog().getActionBar().setDisplayHomeAsUpEnabled(true); final Dialog dialog = preferenceScreen.getDialog(); View homeBtn = dialog.findViewById(android.R.id.home); if (homeBtn != null) { OnClickListener dismissDialogClickListener = new OnClickListener() { @Override public void onClick(View v) { dialog.dismiss(); } }; // Prepare yourselves for some hacky programming ViewParent homeBtnContainer = homeBtn.getParent(); // The home button is an ImageView inside a FrameLayout if (homeBtnContainer instanceof FrameLayout) { ViewGroup containerParent = (ViewGroup) homeBtnContainer.getParent(); if (containerParent instanceof LinearLayout) { // This view also contains the title text, set the whole view as clickable ((LinearLayout) containerParent).setOnClickListener(dismissDialogClickListener); } else { // Just set it on the home button ((FrameLayout) homeBtnContainer).setOnClickListener(dismissDialogClickListener); } } else { // The 'If all else fails' default case homeBtn.setOnClickListener(dismissDialogClickListener); } } return true; } }); ... } 

Следующая ссылка дала мне последние подсказки и код для решения моей проблемы:

Кнопка «Действие» Кнопка «Главная» не работает с вложенным экраном предпочтений

Я делаю это в документах Android в разделе «Поддержка старых версий с заголовками предпочтений» http://developer.android.com/guide/topics/ui/settings.html#BackCompatHeaders . Используя устаревшую функцию PreferenceActivity, вы указываете предпочтение в xml, которое запускает намерение для одного и того же класса активности предпочтений. Действие проверяет действие намерения и определяет, является ли оно вложенным или нет (чтобы показать кнопку «вверх»), и какой префикс xml раздувается на экране.

Конечно, я намерен поддерживать и старые устройства. Я обнаружил, что PreferenceFragment полезен только для больших планшетов, которые используют заголовки предпочтений.

Чтобы повторно использовать настройки между телефонами и планшетами, я придумал это решение https://stackoverflow.com/a/20806812/1139784

Чтобы активировать действие, выполните следующие действия:

 getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayUseLogoEnabled(true); 

Это даст вам значок.

затем добавьте

 @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { // Respond to the action bar's Up/Home button case android.R.id.home: finish(); return true; } return super.onOptionsItemSelected(item); } 

Вы можете изменить это, чтобы идти туда, где вам нужно. В качестве другого варианта вы можете использовать navigateUpTo (намерение намерения) и методы onSupportNavigateUpTo (намерения намерения) и указать намерение, к которому вы хотите вернуться.