Interfejs oparty na widoku możesz dodać do istniejącej aplikacji.
Aby utworzyć nowy ekran oparty całkowicie na Compose, w swojej aktywności wywołaj metodę setContent()
i przekaż dowolne funkcje kompozytowe.
class ExampleActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { // In here, we can call composables! MaterialTheme { Greeting(name = "compose") } } } } @Composable fun Greeting(name: String) { Text(text = "Hello $name!") }
Wygląda on tak samo jak kod, który znajdziesz w aplikacji tylko do tworzenia wiadomości.
ViewCompositionStrategy
za ComposeView
ViewCompositionStrategy
określa, kiedy kompozycja powinna zostać usunięta. Domyślnie
ViewCompositionStrategy.Default
,
usuwa kompozycję, gdy bazowy
ComposeView
odłącza się od okna, chyba że jest częścią kontenera zbiorczego, takiego jak
RecyclerView
W przypadku aplikacji z jedną aktywnością, która korzysta tylko z Compose, takie domyślne zachowanie jest pożądane, ale jeśli stopniowo dodajesz Compose do bazy kodu, w niektórych przypadkach może to spowodować utratę stanu.
Aby zmienić ViewCompositionStrategy
, wywołaj metodę setViewCompositionStrategy()
i wskaż inną strategię.
W tabeli poniżej znajdziesz podsumowanie różnych scenariuszy
ViewCompositionStrategy
w:
ViewCompositionStrategy |
Opis i scenariusz interoperacyjności |
---|---|
DisposeOnDetachedFromWindow |
Skład zostanie usunięty, gdy podstawowy element ComposeView zostanie odłączony od okna. Został zastąpiony przez DisposeOnDetachedFromWindowOrReleasedFromPool .Scenariusz interoperacyjności: * ComposeView czy jest to jedyny element w hierarchii widoku czy w kontekście mieszanego ekranu Widok/Kompozycja (nie w Fragmentach). |
DisposeOnDetachedFromWindowOrReleasedFromPool (domyślny) |
Podobnie jak w przypadku DisposeOnDetachedFromWindow , gdy kompozycja nie znajduje się w kontenerze zbiorczym, takim jak RecyclerView . Jeśli znajduje się w kontenerze puli, jest usuwany, gdy sam kontener puli odłączy się od okna lub zostanie odrzucony (np. gdy pula jest pełna).Scenariusz interakcji: * ComposeView niezależnie od tego, czy jest to jedyny element w hierarchii widoków, czy w kontekście mieszanego ekranu widoku/tworzenia (nie we fragmencie).* ComposeView jako element w kontenerze, takim jak RecyclerView . |
DisposeOnLifecycleDestroyed |
Skład zostanie usunięty, gdy podany obiekt Lifecycle zostanie usunięty.Scenariusz interoperacyjności * ComposeView w widoku fragmentu. |
DisposeOnViewTreeLifecycleDestroyed |
Skład zostanie usunięty, gdy Lifecycle należący do LifecycleOwner zwracany przez ViewTreeLifecycleOwner.get następnego okna, do którego jest przyłączony widok, zostanie usunięty.Scenariusz interoperacyjności: * ComposeView w widoku fragmentu.* ComposeView w widoku, w którym cykl życia nie jest jeszcze znany. |
ComposeView
we fragmentach
Jeśli chcesz włączyć treści interfejsu Compose w fragmentie lub istniejącej widocznej części interfejsu, użyj klasy ComposeView
i wywołaj jej metodę setContent()
. ComposeView
to Android View
.
Element ComposeView
możesz umieścić w układzie XML tak, jak każdy inny element View
:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <androidx.compose.ui.platform.ComposeView android:id="@+id/compose_view" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
W źródłowym kodzie Kotlina napełnij układ z zasobu układu zdefiniowanego w pliku XML. Następnie pobierz ComposeView
za pomocą identyfikatora XML, ustaw strategię tworzenia, która najlepiej pasuje do hosta View
, i wywołaj setContent()
, aby użyć Compose.
class ExampleFragmentXml : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { val view = inflater.inflate(R.layout.fragment_example, container, false) val composeView = view.findViewById<ComposeView>(R.id.compose_view) composeView.apply { // Dispose of the Composition when the view's LifecycleOwner // is destroyed setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) setContent { // In Compose world MaterialTheme { Text("Hello Compose!") } } } return view } }
Możesz też użyć powiązania widoku, aby uzyskać odwołania do
ComposeView
, odwołując się do wygenerowanej klasy powiązania dla pliku układu XML:
class ExampleFragment : Fragment() { private var _binding: FragmentExampleBinding? = null // This property is only valid between onCreateView and onDestroyView. private val binding get() = _binding!! override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { _binding = FragmentExampleBinding.inflate(inflater, container, false) val view = binding.root binding.composeView.apply { // Dispose of the Composition when the view's LifecycleOwner // is destroyed setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) setContent { // In Compose world MaterialTheme { Text("Hello Compose!") } } } return view } override fun onDestroyView() { super.onDestroyView() _binding = null } }
Rysunek 1. Pokazuje dane wyjściowe kodu, który dodaje elementy Compose w
Wyświetl hierarchię UI. Komunikat „Witaj Android!” jest wyświetlany przez
Widżet TextView
. Polecenie „Hello Compose!” jest wyświetlany przez
Element tekstowy tworzenia wiadomości.
Możesz też umieścić ComposeView
bezpośrednio w fragmentach, jeśli Twój pełny ekran został utworzony za pomocą Compose. Pozwoli Ci to całkowicie uniknąć używania pliku układu XML.
class ExampleFragmentNoXml : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { return ComposeView(requireContext()).apply { // Dispose of the Composition when the view's LifecycleOwner // is destroyed setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) setContent { MaterialTheme { // In Compose world Text("Hello Compose!") } } } } }
Wiele instancji ComposeView
w tym samym układzie
Jeśli w tym samym układzie jest wiele elementów ComposeView
, każdy z nich musi
mają unikalny identyfikator umożliwiający działanie funkcji savedInstanceState
.
class ExampleFragmentMultipleComposeView : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View = LinearLayout(requireContext()).apply { addView( ComposeView(requireContext()).apply { setViewCompositionStrategy( ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed ) id = R.id.compose_view_x // ... } ) addView(TextView(requireContext())) addView( ComposeView(requireContext()).apply { setViewCompositionStrategy( ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed ) id = R.id.compose_view_y // ... } ) } }
Identyfikatory ComposeView
są zdefiniowane w pliku res/values/ids.xml
:
<resources> <item name="compose_view_x" type="id" /> <item name="compose_view_y" type="id" /> </resources>
Wyświetlanie podglądu elementów kompozycyjnych w edytorze układów
Możesz też wyświetlić podgląd komponentów w Edytorze układu dla układu XML zawierającego ComposeView
. Dzięki temu możesz zobaczyć, jak Twoje komponenty wyglądają w układzie mieszanym widoków i edytora.
Załóżmy, że w Edytorze układów chcesz wyświetlić ten element kompozycyjny. Notatka
elementów kompozycyjnych z adnotacjami @Preview
dobrze nadają się do wyświetlenia
Układ.
@Preview @Composable fun GreetingPreview() { Greeting(name = "Android") }
Aby wyświetlić tę funkcję kompozycyjną, użyj atrybutu narzędzi tools:composableName
i
ustaw jej wartość na pełną i jednoznaczną nazwę elementu kompozycyjnego do podglądu w
układ.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <androidx.compose.ui.platform.ComposeView android:id="@+id/my_compose_view" tools:composableName="com.example.compose.snippets.interop.InteroperabilityAPIsSnippetsKt.GreetingPreview" android:layout_height="match_parent" android:layout_width="match_parent"/> </LinearLayout>
Dalsze kroki
Znasz już interfejsy API interoperacyjności umożliwiające korzystanie z funkcji Utwórz w widokach. jak korzystać z widoków danych w Compose.
Obecnie nie ma rekomendacji.
Zaloguj się na swoje konto Google.