Korzystanie z opcji tworzenia w widokach

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

ViewCompositionStrategyokreś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:

* ComposeViewczy 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
    }
}

2 nieco różniące się elementy tekstowe, jeden nad drugim

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>

Elementy kompozytowe wyświetlane w edytorze układu

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.

na swoje konto Google.