Android Kotlin подключение навигации во фрагментах с привязкой данных - PullRequest
0 голосов
/ 18 марта 2020

Проблема

У меня есть activity_main.xml, который содержит несколько fragments. 1 из fragment - это bottom_menu_bar, который имеет 2 кнопки, к которым я бы хотел, чтобы приложение переходило при нажатии.

Однако я не уверен, как правильно подключить navController. Должно ли это быть сделано через MainActivity.kt или через FragmentBottomMainMenu.ktv (где создается фрагмент нижней строки меню)

Примечание : согласно android ' s спецификация, я использую databinding, а не findViewById.


activity_main. xml

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto">

<androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

    <fragment
        android:id="@+id/navigation_graph_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:defaultNavHost="true"
        app:navGraph="@navigation/navigation_graph" />


    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/Fragment_Bottom_Main_Menu_hosted_in_activity_main"
        android:name="com.createdlesson.lesson1.FragmentBottomMainMenu"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="1.0" />

</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

MainActivity.kt

class MainActivity : AppCompatActivity() {

private lateinit var binding: ActivityMainBinding

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = DataBindingUtil.setContentView(this, R.layout.activity_main)  // hooking up xml to DataBinding

    //This is just a test. ignore this please. 
    //binding.apply {
        // testText.text = "overwrite text Here" 
    //}
}
}

Fragment_bottom_main_menu. xml

<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto">

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".FragmentBottomMainMenu">
    <androidx.coordinatorlayout.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom">
        <com.google.android.material.bottomnavigation.BottomNavigationView
            android:id="@+id/fragment_bottom_main_menu_items_container"
            android:layout_height="match_parent"
            android:layout_width="wrap_content"
            app:backgroundTint="@color/colorPrimary"
            app:menu="@menu/fragment_bottom_main_menu_items" />
    </androidx.coordinatorlayout.widget.CoordinatorLayout>
</FrameLayout>
</layout>

FragmentBottomMainMenu.kt -> Здесь я думаю NavController должен быть создан и подключен ... Но я не уверен, что это правильно, или как это должно быть сделано правильно

class FragmentBottomMainMenu : Fragment() {

private lateinit var binding: FragmentBottomMainMenuBinding

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    Log.i("FragBotMainMenu", "Inflating bottom main menu")
    binding = DataBindingUtil.inflate(inflater, R.layout.fragment_bottom_main_menu, container, false)
    binding.fragmentBottomMainMenuItemsContainer.setOnNavigationItemSelectedListener {
        when(it.itemId){
            R.id.item1-> {
                view?.findNavController()?.navigate(R.id.action_fragmentBottomMainMenu_to_fragmentItem1)
                println("Navigated to item1")
                return@setOnNavigationItemSelectedListener true
            }
            R.id.item2-> {
                view?.findNavController()?.navigate(R.id.action_fragmentBottomMainMenu_to_fragmentItem2)
                println("Navigated to item2")
                return@setOnNavigationItemSelectedListener true
            }
            else -> {
                println("${it.title}")
                return@setOnNavigationItemSelectedListener true
            }
        }
    }
    return binding.root
}
}

frag_bottom_main_menu_items. xml

<menu xmlns:android="http://schemas.android.com/apk/res/android">

<item
    android:id="@+id/item1"
    android:title="item no 1"/>
<item
    android:id="@+id/item2"
    android:title="item no 2"/>
</menu>

navigation_graph. xml

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/navigation_graph"
app:startDestination="@id/fragmentBottomMainMenu">

<fragment
    android:id="@+id/fragmentBottomMainMenu"
    android:name="com.createdlesson.lesson1.FragmentBottomMainMenu"
    android:label="FragmentBottomMainMenu" >
    <action
        android:id="@+id/action_fragmentBottomMainMenu_to_fragmentItem1"
        app:destination="@id/fragmentItem1" />
    <action
        android:id="@+id/action_fragmentBottomMainMenu_to_fragmentItem2"
        app:destination="@id/fragmentItem2" />
</fragment>

<fragment
    android:id="@+id/fragmentItem1"
    android:name="com.createdlesson.lesson1.FragmentItem1"
    android:label="fragment_item1"
    tools:layout="@layout/fragment_item1"/>
<fragment
    android:id="@+id/fragmentItem2"
    android:name="com.createdlesson.lesson1.FragmentItem2"
    android:label="FragmentItem2" 
    tools:layout="@layout/fragment_item2"/>
</navigation>

Что касается файлов .kt и xml для Item1 и Item2, они просто новый фрагмент .kt и xml файл прямо сейчас. xml имеет тег layout, а файл .kt имеет подключенный к нему databinding. вот и все

1 Ответ

0 голосов
/ 31 марта 2020

Я бы предложил использовать следующие шаблоны, которые просты и легко реализуемы: В вашем Activity_main. xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".uiHost.MainActivity">

    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/nav_host_home"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:defaultNavHost="false"
        app:layout_constraintBottom_toTopOf="@+id/bottom_nav_home"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="1.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="1.0"
        app:navGraph="@navigation/navigation_home" />

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/bottom_nav_home"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:menu="@menu/bottom_nav_home" />


</androidx.constraintlayout.widget.ConstraintLayout>

Код для подключения к bottomNavigation в MainActivity.kt

val navController = childFragmentManager.findFragmentById(R.id.nav_host_home)
mBinding.bottomNavHome.setupWithNavController(navController = navController!!.findNavController())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...