GetSupportLoaderManager () использует те же идентификаторы в разных фрагментах?

Я делаю viewPager в FragmentActivity с несколькими ListFragments. Чтобы заполнить разные списки, я получаю LoaderManager и инициализацию в загрузчике. Я хотел иметь уникальный LoaderManager для каждого фрагмента, однако фрагменты не имеют метода getSupportLoaderManager (), поэтому мне нужно вызвать родительский фрагмент:

getActivity().getSupportLoaderManager() 

Проблема с таким подходом, что мой идентификатор Loaders в разных фрагментах конфликтует с другими. Это может стать немного громоздким, когда у вас уже есть один идентификатор нескольких загрузчиков в одном фрагменте. Итак, есть ли способ получить уникальный LoaderManager для каждого фрагмента вместо вызова родительского? Я в основном хочу иметь возможность использовать один и тот же идентификатор для нескольких фрагментов.

спасибо

Solutions Collecting From Web of "GetSupportLoaderManager () использует те же идентификаторы в разных фрагментах?"

Это был бы слишком длинный комментарий, но я продолжаю нашу дискуссию в комментариях к вашему вопросу.

Вы должны принять это наоборот: жить с тем, что идентификаторы являются локальными для активности, а не фрагментом.

Да, существует плохая связь между фрагментами и действиями. В большинстве случаев обратные вызовы от фрагментов связывают фрагмент с активностью (даже при использовании интерфейса – это не так чисто) и для передачи аргументов из активности в фрагмент: вы должны использовать статический заводский метод для сборки фрагмента и установки его аргументов Через setArgs.

И ваш вопрос связан с такой проблемой связи: идентификаторы загрузчиков в каждом фрагменте действия не должны пересекаться с идентификаторами, используемыми всеми другими фрагментами. Это тоже ограничение связи, поскольку у нас есть ограничение на фрагмент, который лежит на уровне активности. Вы правы, возможно, это могло быть решено Android на уровне фрагмента, введя локаторы-загрузчики для фрагментов.

Тем не менее, могут быть элегантные способы решить эту проблему и сохранить относительную схему де-связи. Например, вы можете создать фабрику идентификаторов, которые будут генерировать «хорошие» идентификаторы для загрузчиков внутри фрагментов и предотвращать совпадение (id ++ будет идеальным):

 public interface IdFactory { public int createId(); } 

Затем внутри каждого фрагмента, когда вам нужен загрузчик:

 this.newLoaderId = idFactory.createId(); 

Фабрика может делиться всеми фрагментами, используя одну из трех стратегий:

  • Синглтон. Каждый фрагмент получит доступ к IdFactory через

    IdFactory idFactory = DefaultIdFactory.getInstance ();

  • Создайте один экземпляр класса, который реализует IdFactory, сделайте этот экземпляр этого класса полем данных в вашем классе приложения и дайте ему getter. Каждый фрагмент сможет получить к нему доступ, используя

    IdFactory idFactory = ((MyApplication) getActivity (). GetApplicationContext ()) .getIdFactory ();

  • Создайте свои фабрики на уровне активности. Либо действия могут реализовать интерфейс IdFactory, либо они могут предоставить внутренний класс для этого. Каждый фрагмент затем будет обращаться к фабрике, используя:

    IdFactory idFactory = getActivity (). GetIdFactory (); // или IdFactory idFactory = (IdFactory) getActivity ();

Третий вариант лучше, так как он будет следовать вашей конкретной потребности и будет следовать жизненным циклам деятельности, позволяя вашим заводам собираться мусор.

Существуют и другие варианты, такие как использование RoboGuice или кинжала или любой другой инфраструктуры инъекций для зависимостей, но это менее стандарт.

Да, вы можете использовать: android.support.v4.app.Fragment.getLoaderManager (), чтобы получить уникальный для каждого фрагмента, что означает, что вы можете начинать свои идентификаторы с нуля.