Показать вверх-кнопку в действии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)
в свою активность, но затем верхняя кнопка отображается только в основных настройках (где это не должно), а не в подэкране.
Мне интересно, что даже в официальных документах подэкран отображается без активной кнопки вверх:
![Setting subscreens]()
Ссылка на документы: Settings
Любая помощь действительно приветствуется
Ответы
Ответ 1
Наконец-то я получил его на работу: D. Это довольно хаки, но это работает.
Проблема заключается в том, что использование подэкранов в xml-layouts приводит к некоторой "кодовой магии".
Для подэкрана запускается новое действие/диалог, и у вас нет прямого доступа к нему.
Чтобы получить доступ к панели действий и 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;
}
});
...
}
Следующая ссылка дала мне последние подсказки и код для решения моей проблемы:
Панель действий Главная кнопка не работает с вложенным экраном предпочтений
Ответ 2
Я делаю это в документах Android в разделе "Поддержка старых версий с заголовками предпочтений" http://developer.android.com/guide/topics/ui/settings.html#BackCompatHeaders. Используя устаревшую функцию PreferenceActivity, вы указываете предпочтение в xml, которое запускает намерение для одного и того же класса активности предпочтений. Действие проверяет действие намерения и определяет, является ли оно вложенным или нет (чтобы показать кнопку "вверх" ) и какой префикс xml для раздувания на экране.
Конечно, я намерен поддерживать и старые устройства. Я обнаружил, что PreferenceFragment полезен только для больших планшетов, которые используют заголовки предпочтений.
Чтобы повторно использовать настройки между телефонами и планшетами, я придумал это решение fooobar.com/questions/168332/...
Ответ 3
Чтобы активировать действие вверх, выполните следующие действия:
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayUseLogoEnabled(true);
это даст вам значок.
затем добавьте
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
// Respond to the action bar Up/Home button
case android.R.id.home:
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
вы можете изменить это, чтобы идти туда, где вам нужно. В качестве другого варианта вы можете использовать navigateUpTo (намерение намерения) и методы onSupportNavigateUpTo (намерение намерения) и указать намерение, к которому вы хотите вернуться.