Изменить фрагмент в действии ящика навигации (Kotlin) - PullRequest
0 голосов
/ 30 мая 2020

Я только начал использовать Фрагменты и ViewModels . Я хочу заменить фрагменты в своей деятельности, как я могу это сделать?

Как лучше всего смешивать Android и фрагменты вместе?

MainActivity

class MainActivity : AppCompatActivity(),NavigationView.OnNavigationItemSelectedListener {

    lateinit var drawerLayout: DrawerLayout
    lateinit var fragmentTransaction: FragmentTransaction

    private lateinit var appBarConfiguration: AppBarConfiguration


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val toolbar: Toolbar = findViewById(R.id.toolbar)
        setSupportActionBar(toolbar)

        drawerLayout= findViewById(R.id.drawer_layout)
        val navView: NavigationView = findViewById(R.id.nav_view)
        val navController = findNavController(R.id.nav_host_fragment)

        val toggle = ActionBarDrawerToggle(this,drawerLayout,toolbar,R.string.navigation_drawer_open,R.string.navigation_drawer_open)
            drawerLayout.addDrawerListener(toggle)
            toggle.syncState()


        // Passing each menu ID as a set of Ids because each
        // menu should be considered as top level destinations.
        appBarConfiguration = AppBarConfiguration(setOf(
                R.id.nav_home, R.id.nav_dersler, R.id.nav_soru,R.id.nav_socialmedia), drawerLayout)
        setupActionBarWithNavController(navController, appBarConfiguration)
        navView.setupWithNavController(navController)

        navView.setNavigationItemSelectedListener(this);

    }

    override fun onNavigationItemSelected(item: MenuItem): Boolean {
        when(item.itemId){
            R.id.nav_home -> {
                  //Toast.makeText(this,"Anasayfa",Toast.LENGTH_SHORT).show()
                }
                R.id.nav_socialmedia -> {
                    Toast.makeText(this,"Sosyal Medya Hesaplarımızı Takip Edebilirsiniz",Toast.LENGTH_SHORT).show()
                }

                R.id.nav_dersler -> {


                }
                R.id.nav_soru -> {

                }


            }
            drawerLayout.closeDrawer(GravityCompat.START)
            return true

        }


        override fun onCreateOptionsMenu(menu: Menu): Boolean {
            menuInflater.inflate(R.menu.main, menu)
            return true
        }




        override fun onOptionsItemSelected(item: MenuItem): Boolean {
             when(item.itemId){
                R.id.action_refresh -> {
                    Toast.makeText(this,"Refreshing...",Toast.LENGTH_SHORT).show()
                    val refreshActivity = intent
                    finish()
                    startActivity(refreshActivity)
                    true
                }

                else -> super.onOptionsItemSelected(item)
            }
            return true
        }

        override fun onSupportNavigateUp(): Boolean {
            val navController = findNavController(R.id.nav_host_fragment)
            return navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp()

        }


}

И у меня есть mobile_navigation. xml, но я не знаю, что он делает. Спасибо за вашу помощь введите описание изображения здесь

1 Ответ

1 голос
/ 30 мая 2020

TL; DR:

Activity - ваш базовый компонент для создания экранов в вашем приложении. Fragment - динамическая c часть вашего экрана, которая была добавлена ​​для поддержки планшетов с большими экранами.

Обычно мы объединяем их следующими способами:

  1. Одно действие как контейнер и все экраны, представленные как Fragment s

Для этого подхода вы можете либо

реализовать его самостоятельно:

Добавить фрагменты в свою деятельность stack:

supportFragmentManager
        .beginTransaction()
        .addToBackStack(null)
        .add(containerId, fragment, fragment::class.java.simpleName)
        .commit()

Замените фрагменты в своей деятельности:

supportFragmentManager
        .beginTransaction()
        .replace(containerId, fragment, fragment::class.java.simpleName)
        .commit()

Но Android вводит Android Компонент навигации для обработки всех этих добавлений, замен и обработка обратного стека:

Я предлагаю использовать этот подход, так как он проще. ССЫЛКА

Используйте несколько действий и фрагментов

Для каждого экрана, который использует BottomNavigation, NavigationDrawer и ... используйте Activity с несколькими фрагментами, представляющими каждую вкладку внутри них.

Хороший учебник можно найти здесь. ССЫЛКА

...