Переключение между фрагментами приводит к зависанию первого
Недавно я начал работать над своим первым Android-приложением с Kotlin после того, как закончил курс по Udemy Дениса Панджуты. Я работал только с Unity3d и до сих пор не имел опыта работы с мобильными приложениями. Это также мой первый пост на stackOverflow.
Итак, прежде всего я хочу описать мою настройку. Я использую AndroidStudio 3.2.1 с языком Kotlin в Windows 10. Я использую встроенное ПО для виртуализации с Nexus6 и API 28 (Pie). У меня есть один главный экран под названием MainInteractionActivity. В этом упражнении я добавил вид нижней навигации с пятью элементами (Dashboard, Timetable, Grades, Todo и Profile) с именем mainBottomNav, а над панелью навигации я добавил представление Fragment под названием mainFragmentView. Я добавил пять фрагментов, представляющих пять опций меню, упомянутых выше. Затем я хотел добавить функциональность для переключения между фрагментами и моей проблемой. Я могу переключаться между всеми Фрагментами, но мой первый Фрагмент (Панель инструментов) "Всегда на заднем плане" светится сквозь остальные светло-серым цветом.
Переключился на GradesFragment
Увеличено в версии изображения 2
На последнем рисунке вы можете ясно увидеть перекрытие. Эта проблема возникает только с первым фрагментом, перекрывающим другие. Всегда исчезают.
Класс MainInteractionActivity.kt:
class MainInteractionActivity : AppCompatActivity() {
private val fragmentManager = supportFragmentManager
private var bottomNav : BottomNavigationView? = null
lateinit var toolbar: ActionBar
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main_interaction)
bottomNav = findViewById(R.id.mainBottomNav)
toolbar = supportActionBar!!
bottomNav?.setOnNavigationItemSelectedListener { item ->
when(item.itemId){
R.id.dashboardMenuItem -> {
toolbar.title = "Dashboard"
changeFragment(dashboardFragment.newInstance())
return@setOnNavigationItemSelectedListener true
}
R.id.timetableMenuItem -> {
toolbar.title = "Timetable"
changeFragment(timetableFragment.newInstance())
return@setOnNavigationItemSelectedListener true
}
R.id.gradesMenuItem -> {
toolbar.title = "Grades"
changeFragment(gradesFragment.newInstance())
return@setOnNavigationItemSelectedListener true
}
R.id.todoMenuItem -> {
toolbar.title = "Todo"
changeFragment(todoFragment.newInstance())
return@setOnNavigationItemSelectedListener true
}
R.id.profileMenuItem -> {
toolbar.title = "Profile"
changeFragment(profileFragment.newInstance())
return@setOnNavigationItemSelectedListener true
}
}
false
}
}
private fun changeFragment(fragment: Fragment){
fragmentManager.beginTransaction()
.replace(R.id.mainFragmentView, fragment)
.addToBackStack(null)
.commit()
}
}
Один пример для класса Fragment dashboardFragment.kt:
class dashboardFragment : Fragment() {
override fun onCreateView(inflater: LayoutInflater,
container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_dashboard, container, false)
}
companion object {
fun newInstance(): dashboardFragment = dashboardFragment()
}
}
Код xml файла меню:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:android="http://schemas.android.com/apk/res/android">
<item android:title="Dashboard" android:id="@+id/dashboardMenuItem"
android:icon="@android:drawable/ic_dialog_dialer"/>
<item android:title="Timetable" android:id="@+id/timetableMenuItem"
android:icon="@android:drawable/ic_menu_agenda"/>
<item android:title="Grades" android:id="@+id/gradesMenuItem"
android:icon="@android:drawable/ic_input_get"/>
<item android:title="Todo" android:id="@+id/todoMenuItem"
android:icon="@android:drawable/checkbox_on_background"/>
<item android:title="Profile" android:id="@+id/profileMenuItem"
android:icon="@android:drawable/ic_menu_myplaces"/>
</menu>
XML-код для MainInteractionActivity:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
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"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainInteractionActivity">
<android.support.design.widget.BottomNavigationView
android:layout_width="0dp"
android:layout_height="54dp"
android:id="@+id/mainBottomNav"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
style="@style/Widget.Design.BottomNavigationView"
app:menu="@menu/main_menu"
app:itemTextColor="@color/common_google_signin_btn_text_light_default"
app:itemBackground="@color/common_google_signin_btn_text_dark_pressed"
app:itemIconTint="@color/common_google_signin_btn_text_light_default"/>
<fragment
android:layout_width="0dp"
android:layout_height="0dp"
android:name="com.student.alexanderhafner.student.dashboardFragment"
android:id="@+id/mainFragmentView"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@+id/mainBottomNav"
tools:layout="@layout/fragment_dashboard"/>
</android.support.constraint.ConstraintLayout>
Действия фрагмента имеют только одно текстовое представление с кратким текстом, описывающим действие.
Я надеюсь, что любой из вас может помочь мне решить мою проблему. Спасибо, Александр.