Подтвердить что ты не робот

Показать вверх-кнопку в действии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

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

4b9b3361

Ответ 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 (намерение намерения) и указать намерение, к которому вы хотите вернуться.