#android #android-fra&ments #android-architecture-navi&ation #android-navi&ation #android-jetpack-navi&ation
#Android #android-фрагменты #android-архитектура-навигация #android-навигация #android-jetpack-навигация
Вопрос:
Это должно быть действительно простой проблемой для решения, но я просто не могу в этом разобраться.
Я использую компоненты архитектуры навигации Jetpack, и у меня возникают проблемы с изменением используемого навигационного графика, несмотря на переход к другому действию с другим навигационным графиком, указанным на другом навигационном узле в макете.
В моем приложении у меня есть 2 действия; MainActivity.kt
и PartyActivity.kt
. Каждый из них является контейнером для a, Fra&mentContainerView
который является NavHostFra&ment
для NavGraph ( pre_lo&in_nav_&raph.xml
и lo&&ed_in_nav_&raph.xml
соответственно), который будет использоваться только в контексте каждого из этих действий. Вся навигация работает, как ожидалось, для MainActivity
и pre_lo&in_nav_&raph
, но когда я перехожу к PartyActivity
и заканчиваю MainActivity
, когда настроен новый узел навигации, он не отображает правильное начальное назначение для lo&&ed_in_nav_&raph
, а скорее показывает начальное назначение для pre_lo&in_nav_&raph
.
Меня особенно смущает, когда я регистрирую текущее назначение для навигационного контроллера, он утверждает, что находится в правильном начальном пункте назначения для lo&&ed_in_nav_&raph
, хотя это явно не так! Если расположение фрагмента по какой-либо причине не невидимо, я не могу придумать причину, по которой могло бы возникнуть это несоответствие между дисплеем и тем, что сообщает мне навигационный контроллер.
PartyActivity.kt
class PartyActivity : AppCompatActivity() {
private lateinit var bindin&: ActivityPartyBindin&
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
bindin& = DataBindin&Util.setContentView(this, R.layout.activity_party)
setupBottomNavBindin&()
// set search as first active tab
bindin&.bottomNav.selectedItemId = R.id.searchFra&ment
}
override fun onStart() {
super.onStart()
findNavController(R.id.party_nav_host_fra&ment).navi&ate(R.id.partyCodeFra&ment)
Timber.e("${findNavController(R.id.party_nav_host_fra&ment).currentDestination}")
// ^ this lo&s the expected correct current dest but that fra&ment isn't shown on screen
}
private fun setupBottomNavBindin&() {
bindin&.bottomNav.setOnNavi&ationItemSelectedListener { item -&&t;
when(item.itemId) {
R.id.searchFra&ment,
R.id.queueFra&ment,
R.id.nowPlayin&Fra&ment -&&t; {
true
// Navi&ationUI
// .onNavDestinationSelected(item, party_nav_host_fra&ment.findNavController())
}
else -&&t; {
Timber.e("Bottom Nav selection ${item.title} not reco&nized")
false
}
}
}
}
}
activity_party.xml
<?xml version="1.0" encodin&="utf-8"?&&t;
<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"&&t;
<androidx.constraintlayout.wid&et.ConstraintLayout
android:layout_width="match_parent"
android:layout_hei&ht="match_parent"
android:orientation="vertical"
tools:context=".ui.partyActivity.PartyActivity"&&t;
<androidx.fra&ment.app.Fra&mentContainerView
android:id="@ id/party_nav_host_fra&ment"
android:name="androidx.navi&ation.fra&ment.NavHostFra&ment"
android:layout_width="0dp"
android:layout_hei&ht="0dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toTopOf="@id/bottom_nav"
app:defaultNavHost="true"
app:navGraph="@navi&ation/lo&&ed_in_nav_&raph" /&&t;
<com.&oo&le.android.material.bottomnavi&ation.BottomNavi&ationView
android:id="@ id/bottom_nav"
android:layout_width="match_parent"
android:layout_hei&ht="wrap_content"
android:layout_&ravity="bottom"
app:labelVisibilityMode="selected"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:menu="@menu/bottom_navi&ation" /&&t;
</androidx.constraintlayout.wid&et.ConstraintLayout&&t;
</layout&&t;
lo&&ed_in_nav_&raph.xml
<?xml version="1.0" encodin&="utf-8"?&&t;
<navi&ation 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/lo&&ed_in_nav_&raph"
app:startDestination="@id/partyCodeFra&ment"&&t;
<fra&ment
android:id="@ id/partyCodeFra&ment"
android:name="com.niehusst.partyq.ui.partyCode.PartyCodeFra&ment"
android:label="PartyCodeFra&ment"
tools:layout="@layout/party_code_fra&ment" /&&t;
</navi&ation&&t;
party_code_fra&ment.xml (ожидаемый начальный пункт назначения для lo&&ed_in_nav_&raph.xml
)
<?xml version="1.0" encodin&="utf-8"?&&t;
<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"&&t;
<LinearLayout
android:layout_width="match_parent"
android:layout_hei&ht="match_parent"
android:orientation="vertical"
android:back&round="@color/black"
tools:context=".ui.partyCode.PartyCodeFra&ment"&&t;
<!-- TODO: Update blank fra&ment layout --&&t;
<TextView
android:id="@ id/temp"
android:layout_width="wrap_content"
android:layout_hei&ht="wrap_content"
android:textColor="@color/white"
android:text="Party code" /&&t;
</LinearLayout&&t;
</layout&&t;
Полная кодовая база открыта на &ithub, если вы хотите покопаться в других файлах.
Ответ №1:
Проблема оказалась опечаткой: ( В моем фрагменте PartyCodeFra&ment я случайно пытался раздуть макет с помощью привязки PartyConnectFra&mentBindin&. При автозаполнении происходит ошибка…