Проблема
У меня есть 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
. вот и все