Вопрос по android – Пропускать заголовки в PreferenceActivity, когда есть только один заголовок

25

Я добавил заголовки настроек в свое приложение, чтобы экран настроек не выглядел неработающим на сотовых и планшетных компьютерах. Однако на данный момент у меня только один заголовок, поэтому вам нужно щелкнуть по экрану заголовка с одной записью на устройствах размером с телефон. Есть ли простой способ сказать Android, чтобы он пропускал экран заголовка, когда заголовок только один, но по-прежнему показывал его на больших экранах?

Кажется, что приложение «Контакты» делает это успешно, но я просматривал егоисточник и не могу понять, как он это делает.

В приложении «Контакты» PreferenceFragment по умолчанию указывается, когда действие по настройке запускается из меню, используя ту же технику, что и @ jdr88. Для получения дополнительной информации, перейдитеhere и Ctrl-F дляsettingsAreMultiPane connor.brinton

Ваш Ответ

4   ответа
4

ИспользуяEXTRA_SHOW_FRAGMENT упомянутый jenzz, вы можете манипулировать Намерением Деятельности, например так:

@Override
protected void onCreate(Bundle savedInstanceState) {
  // By default, show MainPreferences
  Intent intent = getIntent();
  if (intent.getStringArrayExtra(EXTRA_SHOW_FRAGMENT) == null) {
    getIntent().putExtra(EXTRA_SHOW_FRAGMENT, MainPreferences.class.getName());
  }

  super.onCreate(savedInstanceState);
}
1

Я не знаю, можете ли вы специально пропустить заголовок, но я так и сделал.

Я создал 2 класса, один для очень больших экранов и один для остальных. EditPreferences.class загружает мой обычный файл preferences.xml, а EditPreferencesXLarge.class загружает XML-файл preference-headers.

public boolean onOptionsItemSelected(MenuItem item) {
    final int SCREENLAYOUT_SIZE_XLARGE = 4;
    final int HONEYCOMB = 11;
    int screenSize = getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK;

    switch(item.getItemId())
    {
        case R.id.item_prefs:
            if (Build.VERSION.SDK_INT < HONEYCOMB) {
                startActivity(new Intent(this, EditPreferences.class));
            }
            else if (screenSize < SCREENLAYOUT_SIZE_XLARGE) {
                startActivity(new Intent(this, EditPreferences.class));
            }
            else {
                startActivity(new Intent(this, EditPreferencesXLarge.class));
            }

            return true;
    }

    return (super.onOptionsItemSelected(item));
}
Вы действительно можете пропустить заголовок. Я использую оператор if в onBuildHeaders (...) для загрузки заголовков ТОЛЬКО ЕСЛИ это на очень большом экране. В противном случае я использую onPostCreate () для замены содержимого на фрагмент.
60

Вы можете пропустить заголовки, установив один из ваших PreferenceFragments по умолчанию.

Когда вы смотрите наPreferenceActivity.java Источник, вы найдете эти два дополнения:

/**
 * When starting this activity, the invoking Intent can contain this extra
 * string to specify which fragment should be initially displayed.
 */
public static final String EXTRA_SHOW_FRAGMENT = ":android:show_fragment";

/**
 * When starting this activity, the invoking Intent can contain this extra
 * boolean that the header list should not be displayed.  This is most often
 * used in conjunction with {@link #EXTRA_SHOW_FRAGMENT} to launch
 * the activity to display a specific fragment that the user has navigated
 * to.
 */
public static final String EXTRA_NO_HEADERS = ":android:no_headers";

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

Intent intent = new Intent( this, Preferences.class );
intent.putExtra( PreferenceActivity.EXTRA_SHOW_FRAGMENT, PreferencesFragment.class.getName() );
intent.putExtra( PreferenceActivity.EXTRA_NO_HEADERS, true );
Не могли бы вы уточнить, что вы имеете в виду под "установкой одного из ваших PreferenceFragments в качестве значения по умолчанию"? Моя версия ниже. Я не видел альтернативного способа указать значение по умолчанию в XML. (Я проверил источник синтаксического анализа XML.)
Пятно на ответ!
Привет. Я получаю сообщение об ошибке "недопустимый фрагмент для этого действия". Что я должен делать?
Это то, что я искал! Благодарю. Я обнаружил, что просто использование EXTRA_SHOW_FRAGMENT означает, что заголовки все еще видны на планшете, но он переходит прямо к фрагменту настроек на телефоне, что именно то, что я хотел. Freaky Dug
3

Вы можете удалить этот код в своей деятельности.

     public void onBuildHeaders(List<Header> target) {
        loadHeadersFromResource(R.xml.pref_general, target);
    }

И замени свой фрагмент:

public class SettingsActivity extends AppCompatPreferenceActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
           getFragmentManager().beginTransaction().replace(android.R.id.content,
                new GeneralPreferenceFragment()).commit();

    }

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public static class GeneralPreferenceFragment extends PreferenceFragment {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.pref_general);

        }

    }

}

Похожие вопросы