Получить фрагмент из навигационного ящика - PullRequest
0 голосов
/ 07 ноября 2019

Я сейчас пытаюсь создать фрагменты из ящика навигации. Проблема в том, что в прошлом я мог сделать это с помощью:

MyFragment fragment = getSupportFragmentManager().findFragmentByid(R.id.fragmentId);

Но теперь в библиотеке поддержки AndroidX все изменилось, и теперь я не знаю, как извлечь фрагменты из NavController, NavigationUIили что угодно. Мне нужно создать экземпляры моих фрагментов, чтобы я мог реализовать интерфейсы для этих фрагментов из MainActivity, чтобы обмениваться фрагментами между ними.

Я использую шаблон активности NavigationDrawer из Android Studio 3.5.1

Ответы [ 2 ]

0 голосов
/ 08 ноября 2019

При использовании Навигации и NavHostFragment ваши Фрагменты являются дочерними фрагментами NavHostFragment в вашем макете.

Fragment navHostFragment = getSupportFragmentManager().findFragmentById(
    R.id.nav_host_fragment); // Whatever your ID in your layout is
FragmentManager childFragmentManager = navHostFragment.getChildFragmentManager();
// Now you can get your Fragment from the childFragmentManager
MyFragment fragment = childFragmentManager.findFragmentByid(R.id.fragmentId);

Однако рекомендуемый шаблон для передачи интерфейсов вашим Фрагментам в мире Навигациичерез инжекцию в конструктор с использованием FragmentFactory, как обсуждалось в Фрагментах: прошлое, настоящее и будущее :

// Create an interface for what methods you want to expose
interface Callback {
  // whatever methods you want
}

// Change your Fragment to take in that interface
class MyFragment(val callback: Callback) : Fragment() {
    // Now your Fragment always has a reference to the Callback
}

private class MyActivityFactory(
    callback: Callback
) : FragmentFactory() {
    override fun instantiate(
        classLoader: ClassLoader,
        className: String
    ) = when (className) {
        MyFragment::class.java.name -> MyFragment(callback)
        else -> super.instantiate(classLoader, className)
    }
}

// Now update your MyActivity to implement the interface
// and pass itself into an instance of the FragmentFactory you created
class MyActivity : AppCompatActivity(), Callback {
    override fun onCreate(savedInstanceState: Bundle?) {
        supportFragmentManager.fragmentFactory =
            MyActivityFactory(this)
        super.onCreate(savedInstanceState)
        ...
    }
}

Используя FragmentFactory, воссоздание после изменений конфигурации ипервоначальное создание обрабатывается таким же образом. Это также позволяет вам проверить ваш фрагмент изолированно , используя FragmentScenario (что занимает FragmentFactory)

0 голосов
/ 07 ноября 2019

Прежде всего, просто убедитесь, что все ваши фрагменты теперь в последней библиотеке с Android X. А позже, просто используйте следующее:

MyFragment fragment = getFragmentManager()
      .findFragmentByid(R.id.fragmentId);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...