さまざまなデバイスの向きをサポートするアプリを作成しています。ナビゲーションはAndroid Jetpackのナビゲーションによって実行されます。横向きのアプリのメイン画面は下にあります。これはリストラッパーフラグメントです(NavHostFragment
で、アクティビティのレイアウトに追加されます) fragment
タグ)、ラッパーにはリストフラグメント(fragment
)と詳細フラグメント(FrameLayout
)が含まれます。縦向きも同様です(ラッパーとリストに含まれ、詳細にはアクセス可能なスローナビゲーション) 。
私の問題は、デバイスの向きを変更した後に例外が発生することです
Java.lang.IllegalStateException:現在のナビゲーションノードがありません
データをモックしたレイアウトの最初のバージョンは正常に機能しました。ROOMをアプリに追加し、新しい注文と更新注文のフラグメントを追加すると、エラーが表示されます。残念ですが、エラーの原因を正確に特定することはできません。
リストラッパーコード
_class OrderListWrapperFragment : RxFragment() {
private val disposable = CompositeDisposable()
var selectedOrderId: Long = 0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val bundle = savedInstanceState ?: arguments
bundle?.let {
selectedOrderId = it.getLong(EXTRA_ORDER_ID)
}
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? = inflater.inflate(R.layout.orders__list_wrapper, container, false)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initializeToolbar(toolbar, getString(R.string.orders_title), false)
newOrderButton
.clicks()
.subscribe {
findNavController()
.navigate(R.id.action_orderListWrapperFragment_to_orderNewFragment)
}
.addTo(disposable)
childFragmentManager.registerFragmentLifecycleCallbacks(callback, false)
}
override fun onDestroyView() {
super.onDestroyView()
childFragmentManager.unregisterFragmentLifecycleCallbacks(callback)
disposable.clear()
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putLong(EXTRA_ORDER_ID, selectedOrderId)
}
private val callback = object : FragmentManager.FragmentLifecycleCallbacks() {
private val disposable = CompositeDisposable()
override fun onFragmentResumed(fm: FragmentManager, fragment: Fragment) {
super.onFragmentResumed(fm, fragment)
if (fragment is OrderListFragment) {
fragment
.selectedItemIdChanges
.subscribeBy(onNext = {
selectedOrderId = it
if (orderDetailsContainer != null) {
childFragmentManager.commit {
replace(
R.id.orderDetailsContainer,
OrderDetailsFragment.newInstance(it)
)
}
} else {
findNavController()
.navigate(
R.id.action_orderListWrapperFragment_to_orderDetailsFragment,
bundleOf(EXTRA_ORDER_ID to it)
)
selectedOrderId = 0
}
},
onError = {
Log.d("detailView", it.toString())
})
.addTo(disposable)
val orderId = selectedOrderId
if (orderId != 0L) {
if (orderDetailsContainer != null) {
childFragmentManager.commit {
replace(
R.id.orderDetailsContainer,
OrderDetailsFragment.newInstance(orderId)
)
}
} else {
findNavController()
.navigate(//exception throws here
R.id.action_orderListWrapperFragment_to_orderDetailsFragment,
bundleOf(EXTRA_ORDER_ID to orderId)
)
selectedOrderId = 0
}
}
}
}
override fun onFragmentPaused(fm: FragmentManager, fragment: Fragment) {
super.onFragmentPaused(fm, fragment)
if (fragment is OrderListFragment) {
disposable.clear()
}
}
}
companion object {
private const val EXTRA_ORDER_ID = "EXTRA_ORDER_ID"
}
}
_
私のナビゲーショングラフ
_<?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/orderListWrapperFragment">
<fragment
Android:id="@+id/orderListWrapperFragment"
Android:name="com.mtgshipping.app.orders.orderList.OrderListWrapperFragment"
Android:label="OrderListWrapperFragment"
tools:layout="@layout/orders__list_wrapper">
<action
Android:id="@+id/action_orderListWrapperFragment_to_orderDetailsFragment"
app:destination="@id/orderDetailsFragment"/>
<action
Android:id="@+id/action_orderListWrapperFragment_to_orderNewFragment"
app:destination="@id/orderNewFragment"/>
<action
Android:id="@+id/action_orderListWrapperFragment_to_orderUpdateFragment"
app:destination="@id/orderUpdateFragment"/>
</fragment>
<fragment
Android:id="@+id/orderDetailsFragment"
Android:name="com.mtgshipping.app.orders.orderDetails.OrderDetailsFragment"
Android:label="OrderDetailsFragment"
tools:layout="@layout/orders__order_details">
<action
Android:id="@+id/action_orderDetailsFragment_to_orderUpdateFragment"
app:destination="@id/orderUpdateFragment"/>
</fragment>
<fragment
Android:id="@+id/orderNewFragment"
Android:name="com.mtgshipping.app.orders.orderNew.OrderNewFragment"
Android:label="OrderNewFragment"
tools:layout="@layout/orders__order_new">
<action
Android:id="@+id/action_orderNewFragment_to_orderListWrapperFragment"
app:destination="@id/orderListWrapperFragment"/>
</fragment>
<fragment
Android:id="@+id/orderUpdateFragment"
Android:name="com.mtgshipping.app.orders.orderUpdate.OrderUpdateFragment"
Android:label="OrderUpdateFragment"
tools:layout="@layout/orders__order_update">
<action
Android:id="@+id/action_orderUpdateFragment_to_orderListWrapperFragment"
app:destination="@id/orderListWrapperFragment"/>
</fragment>
</navigation>
_
NavController
でデバッグを行いました。デバイスのローテーション後の746行目でNavDestination currentNode = mBackStack.isEmpty() ? mGraph : mBackStack.getLast().getDestination();
と表示されましたmGraph
はnull
で、他のプライベートフィールドもnull
。多分何かがNavController
を正しく初期化するのを妨げます。必要に応じて、レイアウトやその他のコードを提供できます。
私にとっての問題は、ライフサイクルの依存関係のバージョンでした
"androidx.lifecycle:lifecycle-extensions:$lifecycle_version
バージョン '2.2.0'で問題が発生したため、 '2.1.0'を使用するように戻りました
lifecycle_version = '2.1.0'