Как получить доступ к PreferenceFragment по идентификатору? - PullRequest
4 голосов
/ 02 декабря 2011

У меня есть настройки стиля Сота.Я определяю заголовки:

<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
  <header android:id="@+id/pref_general" android:fragment="MyPreferencesFragment" android:title="@string/pref_general_title">
    <extra android:name="resource" android:value="pref_general" />
  </header>
  <header android:id="@+id/pref_sharing" android:fragment="MyPreferencesFragment" android:title="@string/pref_sharing_title">
    <extra android:name="resource" android:value="pref_sharing" />
  </header>
</preference-headers>

Затем загружаю их в PreferenceActivity:

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

Как я могу затем адресовать точный фрагмент по его идентификатору в startPreferenceFragment?Как я могу получить доступ к элементу списка, соответствующему этому фрагменту, чтобы я мог включить / отключить его?

Ответы [ 2 ]

2 голосов
/ 06 марта 2013

Я нашел решение.Нет прямого доступа к фрагменту, но его можно найти через ListAdapter.В вашей PreferenceActivity вы можете написать:

int fragmentId = R.id.pref_sharing;
for (int i = 0; i < getListAdapter().getCount(); i++)
{
    Header header = (Header) getListAdapter().getItem(i);
    if (fragmentId == header.id)
    {
        // You can access a fragment name (class)
        String fragment = header.fragment;
        // You can access fragment arguments
        Bundle args = header.fragmentArguments;
    }
}

Я не нашел способа отключить элемент списка заголовков, но создал обходной путь на основе этого кода.

0 голосов
/ 10 августа 2015

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

  1. Переопределите onAttach() в своем фрагменте и передайте ссылку на себя (то есть, this) на переданное действие. Сохраните копию ссылки в действии хоста и используйте ее для вызова любого метода, в котором вы хотите Ваш фрагмент прямо позже. См. здесь для примера. Кредит предоставляется @Devunwired для этого решения.
  2. То же, что (1), но передает идентификатор фрагмента активности хоста вместо this. Вы можете использовать getId , чтобы получить идентификатор фрагмента в его методе onAttach(). Затем используйте обычный findFragmentById в своей деятельности, чтобы извлечь фрагмент, когда вы этого хотите.
  3. Обновите статическую переменную int в вашей активности хоста (напрямую или с помощью открытого метода) с помощью идентификатора фрагмента, который можно найти с помощью getId в onAttach() или onCreate() из твой фрагмент. Затем используйте findFragmentById в своей деятельности, как и раньше. Это включает в себя меньше кодирования, чем (1) или (2), но это ужасный хак!

Было бы хорошо, если бы Android облегчал прямой доступ к фрагментам в заголовках. Некоторое время я не мог понять, почему использование значения android:id в XML макета не работает с findFragmentById, пока я не понял, что заголовок не является фрагментом!

...