Interop-Rezept
In diesem Rezept wird gezeigt, wie Sie AndroidFragment und AndroidView in einer Navigation3-Anwendung verwenden.
Funktionen
- AndroidFragment: Hier wird gezeigt, wie Sie ein Fragment in ein Composable-Ziel einbetten.
- AndroidView: Hier wird gezeigt, wie eine klassische Android-View in ein Composable-Zielvorhaben eingebettet wird.
Schlüsselkomponenten
InteropActivity: Die Hauptaktivität, die die Navigation hostet.MyCustomFragment: Ein einfaches Fragment, das im Beispiel verwendet wird.AndroidFragment<T>: Eine Composable, in der ein Fragment gehostet wird.AndroidView: Eine Composable, die eine Android-Ansicht enthält.
Nutzung
- Führen Sie
InteropActivityaus. - Auf dem Startbildschirm wird ein Fragment angezeigt.
- Klicken Sie auf „Zur Ansicht wechseln“, um zu einem Bildschirm mit einer
TextViewzu gelangen.
package com.example.nav3recipes.interop import android.annotation.SuppressLint import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.TextView import androidx.fragment.app.Fragment class MyCustomFragment : Fragment() { @SuppressLint("SetTextI18n") override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { return TextView(requireContext()).apply { text = "My Fragment" } } }
package com.example.nav3recipes.interop import android.annotation.SuppressLint import android.os.Bundle import android.widget.TextView import androidx.activity.compose.setContent import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.material3.Button import androidx.compose.material3.Text import androidx.compose.ui.Modifier import androidx.compose.ui.viewinterop.AndroidView import androidx.fragment.app.FragmentActivity import androidx.fragment.compose.AndroidFragment import androidx.lifecycle.compose.dropUnlessResumed import androidx.navigation3.runtime.NavKey import androidx.navigation3.runtime.entryProvider import androidx.navigation3.runtime.rememberNavBackStack import androidx.navigation3.ui.NavDisplay import com.example.nav3recipes.ui.setEdgeToEdgeConfig import kotlinx.serialization.Serializable @Serializable private data object FragmentRoute : NavKey @Serializable private data class ViewRoute(val id: String) : NavKey class InteropActivity : FragmentActivity() { @SuppressLint("SetTextI18n") override fun onCreate(savedInstanceState: Bundle?) { setEdgeToEdgeConfig() super.onCreate(savedInstanceState) setContent { val backStack = rememberNavBackStack(FragmentRoute) NavDisplay( backStack = backStack, onBack = { backStack.removeLastOrNull() }, entryProvider = entryProvider { entry<FragmentRoute> { Column(Modifier.fillMaxSize().wrapContentSize()) { AndroidFragment<MyCustomFragment>() Button(onClick = dropUnlessResumed { backStack.add(ViewRoute("123")) }) { Text("Go to View") } } } entry<ViewRoute> { key -> AndroidView( modifier = Modifier.fillMaxSize().wrapContentSize(), factory = { context -> TextView(context).apply { text = "My View with key: ${key.id}" } } ) } } ) } } }