рд▓рдбрд╝рд╛рдИ рдореЗрдВ Jetpack рдХрдореНрдкреЛрдЬрд╝ рдХреА рдХреЛрд╢рд┐рд╢?

рдЕрдВрдд рдореЗрдВ, рд╡рд╣ рдХреНрд╖рдг рдЖ рдЧрдпрд╛ рд╣реИ рдЬрдм рдЖрдкрдХреЛ рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рдирдП рдШреЛрд╖рдгрд╛рддреНрдордХ рдпреВрдЖрдИ рдврд╛рдВрдЪреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ рдПрдВрдбреНрд░реЙрдЗрдб рд╕реНрдЯреВрдбрд┐рдпреЛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЬреЗрдЯрдкреИрдХ рдХрдореНрдкреЛрдЬ рдЕрдм Google рдХреЗ рдорд╛рд╡реЗрди рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдкрд░ рдкрд╣рд▓реЗ рджреЗрд╡ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред рдЗрд╕ рдЦрдмрд░ рдХреЗ рд╕рд╛рде, рдореЗрд░рд╛ рд╕реЛрдорд╡рд╛рд░ рд╕реБрдмрд╣ рд╢реБрд░реВ рд╣реБрдЖред рдФрд░ рддреБрд░рдВрдд рдпрд╣ рджреЗрдЦрдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рдереА рдХрд┐ рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдХреНрдпрд╛ рдерд╛ рдЬреЛ рд╡реЗ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣реЗ рдереЗред



рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкрд░рд┐рдЪрд┐рдд рдХреЛ Google Play рдкрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рдкрд╛рд▓рддреВ-рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рд╕реЗ рддреБрд░рдВрдд рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдореИрдВ рдПрдХ рдкреЗрдЬ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ "рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ"ред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдХрдореНрдкреЛрдЬрд╝ рдХреЗ рдореБрдЦреНрдп рдШрдЯрдХреЛрдВ рдФрд░ рдХрдиреЗрдХреНрд╢рди рдЪрд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛:


  1. рдирд┐рд░реНрднрд░рддрд╛ рдХрдиреЗрдХреНрд╢рди
  2. рд╡рд┐рд╖рдпреЛрдВ рдФрд░ рд╢реИрд▓рд┐рдпреЛрдВред рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдореМрдЬреВрджрд╛ рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдгред
  3. рдкрд╣реБрдВрдЪ рдФрд░ UI рдкрд░реАрдХреНрд╖рдгред
  4. рд╡реНрдпреВ рд╡рд╛рд░рд┐рд╕ рдХреЗ рдореБрдЦреНрдп рдШрдЯрдХ рдФрд░ рдПрдирд╛рд▓реЙрдЧреНрд╕ред
  5. рд░рд╛рдЬреНрдп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВред

рдирд┐рд░реНрднрд░рддрд╛ рдХрдиреЗрдХреНрд╢рди


рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЛ 3.5 рд╕реЗ 3.5.1 (рд╡реНрдпрд░реНрде рдореЗрдВ) рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛, рдмреБрдирд┐рдпрд╛рджреА рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЬреЛрдбрд╝рд╛ред рд╕рд┐рд░рд┐рд▓ рдХреЗ рдПрдХ рд▓реЗрдЦ рдореЗрдВ рдПрдХ рдкреВрд░реА рд╕реВрдЪреА рджреЗрдЦреА рдЬрд╛ рд╕рдХрддреА рд╣реИред


// build.gradle ext.compose_version= '0.1.0-dev01' //build.gradle  dependencies{ ... implementation "androidx.compose:compose-runtime:$compose_version" kapt "androidx.compose:compose-compiler:$compose_version" implementation "androidx.ui:ui-layout:$compose_version" implementation "androidx.ui:ui-android-text:$compose_version" implementation "androidx.ui:ui-text:$compose_version" implementation "androidx.ui:ui-material:$compose_version" } 

рдФрд░ рдлрд┐рд░ рдореИрдВрдиреЗ рдлрд╛рдпрд░рдмреЗрд╕ рдХреЗ рдЫрд┐рддрд░реЗ рд╣реБрдП рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рдХрд╛рд░рдг рдпрд╣ рд╕рдм рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдореИрдВ рдХрдореНрдкреЛрдЬрд╝ рдмрд╛рдзрд╛рдУрдВ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛:


 app/src/main/AndroidManifest.xml Error: uses-sdk:minSdkVersion 16 cannot be smaller than version 21 declared in library [androidx.ui:ui-layout:0.1.0-dev01] .../ui-layout-0.1.0-dev01/AndroidManifest.xml as the library might be using APIs not available in 16 Suggestion: use a compatible library with a minSdk of at most 16, or increase this project's minSdk version to at least 21, or use tools:overrideLibrary="androidx.ui.layout" to force usage (may lead to runtime failures) 

рд╣рд╛рдВ, рдХрдореНрдкреЛрдЬ рдХреЗрд╡рд▓ рдорд┐рдиреНрд╕рдХреЙрдХ 21 (рд▓реЙрд▓реАрдкреЙрдк) рдХреЗ рд╕рд╛рде рдЙрдкрд▓рдмреНрдз рдерд╛ред рд╢рд╛рдпрдж рдпрд╣ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдЙрдкрд╛рдп рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдУрдПрд╕ рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдереАред


рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдм рдирд╣реАрдВ рд╣реИред рдХреЛрдЯрд▓рд┐рди рдХрдВрдкрд╛рдЗрд▓рд░ рдкреНрд▓рдЧрд┐рди рдХреЗ рдмрдЬрд╛рдп, рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдЧрдпрд╛ рдерд╛, рдпрд╣рд╛рдБ , рдкрд░рд╛рд╡рд░реНрддрди рдкрд░ рд░рдЪрдирд╛ рд▓рд┐рдЦреЗрдВред рдЗрд╕рд▓рд┐рдП, рд╕рдм рдХреБрдЫ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреЛрдЯрд▓рд┐рди рд░рд┐рдлреНрд▓реЗрдХреНрдЯ рдХреЛ рднреА рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:


 implementation "org.jetbrains.kotlin:kotlin-reflect" 

рдЦреИрд░, рдорд┐рдард╛рдИ рдХреЗ рд▓рд┐рдПред рдЗрдВрдЯ, рд▓реЙрдиреНрдЧ, рдлреНрд▓реЛрдЯ рдХреЗ рд▓рд┐рдП рдбреАрдкреА рдЗрдореНрдкреНрд▓реАрдореЗрдВрдЯ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдлрд╝рдВрдХреНрд╢рдВрд╕ рд▓рд┐рдЦреЗрдВ, рдЬреЛ рдЗрдирд▓рд╛рдЗрди рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рд╣реИрдВред рдЗрд╕рд╕реЗ рдПрдХ рдирдИ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ:


 Cannot inline bytecode built with JVM target 1.8 into bytecode that is being built with JVM target 1.6. Please specify proper '-jvm-target' option * https://stackoverflow.com/questions/48988778/cannot-inline-bytecode-built-with-jvm-target-1-8-into-bytecode-that-is-being-bui 

рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреЛрдЯрд▓рд┐рди рдХреЗ рд▓рд┐рдП рдЬреЗрд╡реАрдПрдо рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


 android { тАж kotlinOptions { jvmTarget = "1.8" } } 

рд╡рд╣ рд╕рдм рдорд╛рд▓реВрдо рд╣реЛрддрд╛ рд╣реИред рдЕрдкрдиреЗ рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЗ рдирд┐рд░реНрдорд╛рдг рд╕реЗ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ)


рдЖрдЗрдП рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ (рд╕рд╛рдЗрд░рд┐рд▓ рдХреЗ рд▓реЗрдЦ рд╕реЗ рднреА, рд▓реЗрдХрд┐рди, рдЙрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдлреНрд░реИрдЧрдореЗрдВрдЯ рдХреЗ рдЕрдВрджрд░ рдХрдореНрдкреЛрдЬрд╝ рдЬреЛрдбрд╝реЗрдВ)ред рдЯреБрдХрдбрд╝реЗ рдХреЗ рд▓рд┐рдП рд▓реЗрдЖрдЙрдЯ рдПрдХ рдЦрд╛рд▓реА FrameLayout рд╣реИред


 override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { val fragmentView = inflater.inflate(R.layout.fragment_about, container, false) (fragmentView as ViewGroup).setContent { Hello("Jetpack Compose") } return fragmentView } @Composable fun Hello(name: String) = MaterialTheme { FlexColumn { inflexible { // Item height will be equal content height TopAppBar<MenuItem>( // App Bar with title title = { Text("Jetpack Compose Sample") } ) } expanded(1F) { // occupy whole empty space in the Column Center { // Center content Text("Hello $name!") // Text label } } } } 

рд╣рдо рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдирд┐рдореНрди рд╕реНрдХреНрд░реАрди рдирд┐рдХрд▓рддреА рд╣реИ:


рдЫрд╡рд┐

рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдХреЙрдиреНрд╕рдЯреЗрдмрд▓ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рд╛рдордЧреНрд░реА рдереАрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд╣рдореЗрдВ рдПрдХ рдмреИрдВрдЧрдиреА рдРрдкрдмрд╛рд░ рдорд┐рд▓рд╛ред рдареАрдХ рд╣реИ, рдФрд░, рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ, рдпрд╣ рдЖрд╡реЗрджрди рдХреЗ рдЕрдВрдзреЗрд░реЗ рд╡рд┐рд╖рдп рдХреЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реИ:


рдЫрд╡рд┐

рдЖрдЗрдП рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред


рд╡рд┐рд╖рдпреЛрдВ рдФрд░ рд╢реИрд▓рд┐рдпреЛрдВред рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдореМрдЬреВрджрд╛ рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдгред


рдХрдореНрдкреЛрдЬрд╝реЗрдмрд▓ рдХреЗ рдЕрдВрджрд░ рдореМрдЬреВрджрд╛ рд╢реИрд▓рд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЙрдиреНрд╣реЗрдВ MaterialTheme рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдЕрдВрджрд░ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ:


 @Composable fun Hello(name: String) = MaterialTheme(colors = MaterialColors( primary = resolveColor(context, R.attr.colorPrimary, MaterialColors().primary), secondary = resolveColor(context, R.attr.colorSecondary, MaterialColors().secondary), onBackground = resolveColor(context, R.attr.textColor, MaterialColors().onBackground) )){...} 

MaterialTheme рдореЗрдВ рджреЛ рднрд╛рдЧ рд╣реЛрддреЗ рд╣реИрдВ: MaterialColors рдФрд░ MaterialTypographyред
рд░рдВрдЧреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд╢реИрд▓рд┐рдпреЛрдВ рдкрд░ рдПрдХ рдЖрд╡рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛:


 private fun resolveColor(context: Context?, @AttrRes attrRes: Int, colorDefault: Color) = context?.let { Color(resolveThemeAttr(it, attrRes).data.toLong()) } ?: colorDefault private fun resolveThemeAttr(context: Context, @AttrRes attrRes: Int): TypedValue { val theme = context.theme val typedValue = TypedValue() theme.resolveAttribute(attrRes, typedValue, true) return typedValue } 

рдЗрд╕ рд╕реНрддрд░ рдкрд░, AppBar рд╣рд░рд╛ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рд▓реЗрдХрд┐рди рдкрд╛рда рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдПрдХ рдФрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


 Text("Hello $name!", style = TextStyle(color = +themeColor { onBackground })) 

рдереАрдо рдХреЛ рдпреВрдирд┐рд░реА рдкреНрд▓рд╕ рдСрдкрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рдЬреЗрдЯ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрдЯреЗрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди рднреА рд╣рдо рдЗрд╕реЗ рджреЗрдЦреЗрдВрдЧреЗред


рдЕрдм рдирдпрд╛ рд╕реНрдХреНрд░реАрди рдереАрдо рдХреЗ рджреЛрдиреЛрдВ рд╡реЗрд░рд┐рдПрдВрдЯ рдореЗрдВ рдмрд╛рдХреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:


рдЫрд╡рд┐

рдХрдореНрдкреЛрдЬрд╝ рдХреЛ рд╕реВрддреНрд░реЛрдВ рдореЗрдВ DarkTheme.kt рдлрд╝рд╛рдЗрд▓ рднреА рдорд┐рд▓реА, рдЬрд┐рд╕рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдПрдВрдбреНрд░реЙрдЗрдб рдкреА рдФрд░ 10 рдкрд░ рдПрдХ рдбрд╛рд░реНрдХ рдереАрдо рдХреЛ рдЪрд╛рд▓реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдЯреНрд░рд┐рдЧрд░реНрд╕ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдкрд╣реБрдВрдЪ рдФрд░ UI рдкрд░реАрдХреНрд╖рдгред


рдЬрдм рддрдХ рд╕реНрдХреНрд░реАрди рдирдП рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрдирд╛ рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рддреЛ рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рд▓реЗрдЖрдЙрдЯ рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рдореЗрдВ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ рдФрд░ рджреЗрд╡ рдореЛрдб рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреА рд╕реАрдорд╛рдУрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде:



рдЫрд╡рд┐

рдпрд╣рд╛рдБ рд╣рдо FrameLayout рджреЗрдЦреЗрдВрдЧреЗ, рдЬрд┐рд╕рдХреЗ рдЕрдВрджрд░ рдХреЗрд╡рд▓ AndroidComposeView рд╣реИред Accebility рдФрд░ UI рдкрд░реАрдХреНрд╖рдг рдХреЗ рдореМрдЬреВрджрд╛ рдЙрдкрдХрд░рдг рдЕрдм рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реИрдВ? рд╢рд╛рдпрдж рдЙрдирдХреЗ рдмрдЬрд╛рдп рдЕрдм рдПрдХ рдирдпрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реЛрдЧрд╛: androidx.ui:ui-test ред


рд╡реНрдпреВ рд╡рд╛рд░рд┐рд╕ рдХреЗ рдореБрдЦреНрдп рдШрдЯрдХ рдФрд░ рдПрдирд╛рд▓реЙрдЧреНрд╕ред


рдЕрдм рд╕реНрдХреНрд░реАрди рдХреЛ рдереЛрдбрд╝рд╛ рдФрд░ рдЬрд╛рдирдХрд╛рд░реАрдкреВрд░реНрдг рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдмрджрд▓реЗрдВ, Google Play рдкрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреЗрдЬ рдкрд░ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдПрдХ рдмрдЯрди рдФрд░ рдПрдХ рд▓реЛрдЧреЛ рдХреЗ рд╕рд╛рде рдПрдХ рддрд╕реНрд╡реАрд░ рдЬреЛрдбрд╝реЗрдВред рдореИрдВ рдЖрдкрдХреЛ рддреБрд░рдВрдд рдХреЛрдб рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдФрд░ рдХреНрдпрд╛ рд╣реБрдЖ:


 @Composable fun AboutScreen() = MaterialTheme(...) { FlexColumn { inflexible { TopAppBar<MenuItem>(title = { Text(getString(R.string.about)) }) } expanded(1F) { VerticalScroller { Column { Image() Title() MyButton() } } } } } private fun Image() { Center { Padding(16.dp) { Container( constraints = DpConstraints( minWidth = 96.dp, minHeight = 96.dp ) ) { imageFromResource(resources, R.drawable.ic_launcher) } } } } private fun Title() { Center { Padding(16.dp) { Text(getString(R.string.app_name) + " " + BuildConfig.VERSION_NAME, style = TextStyle(color = +themeColor { onBackground })) } } } private fun MyButton() { Center { Padding(16.dp) { Button(getString(R.string.about_button), onClick = { openAppInPlayStore() }) } } } 

рдЫрд╡рд┐

рдХрдореНрдкреЛрдЬрд╝ рд╕реНрд░реЛрддреЛрдВ рдХреА рдкрд╣рд▓реА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рдж рд╕реЗ рд╡рд┐рдЬреЗрдЯ рд░рдЪрдирд╛ рдХреЗ рдореВрд▓ рд╕рд┐рджреНрдзрд╛рдВрдд рдирд╣реАрдВ рдмрджрд▓реЗ рд╣реИрдВ ред


рджрд┐рд▓рдЪрд╕реНрдк рд╕реЗ:


  • рд╡реНрдпрдХреНрддрд┐рдЧрдд рддрддреНрд╡реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп @ рдХреЙрдо рдХреЗ рд╕рд╛рде рдПрдиреЛрдЯреЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
  • рд╡рд┐рдЧреЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ рд╕рднреА рдЧреБрдг рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рдЬреЗрдЯ рдореЗрдВ рдмрджрд▓ рдЧрдП (рдХреЗрдВрджреНрд░ Android рдХреЗ рдмрдЬрд╛рдп: рдЧреБрд░реБрддреНрд╡рд╛рдХрд░реНрд╖рдг, Android рдХреЗ рдмрдЬрд╛рдп рдкреИрдбрд┐рдВрдЧ: рдорд╛рд░реНрдЬрд┐рди, ...)
  • рдореИрдВ рдЪрд┐рддреНрд░ рд╕реЗ рдЪрд┐рддреНрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ред
  • рдмрдЯрди рдХрд╛ рдСрдирдХрд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ рдЕрдВрддрд┐рдо рдирд╣реАрдВ рд╣реИ, рдЗрд╕ рдХрд╛рд░рдг рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рдирд╛рдо рдХреЗ рдмрд┐рдирд╛ рд▓рдВрдмреЛ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рдЬреЛ рдЕрдзрд┐рдХ рддрд╛рд░реНрдХрд┐рдХ рдкреНрд░рддреАрдд рд╣реЛрдЧрд╛:
     Button(тАЬText"){ openAppInPlayStore() } 

рдЕрдм рдЪрд▓рд┐рдП рдореБрдЦреНрдп рдореМрдЬреВрджрд╛ рд╡реНрдпреВрдЧреНрд░реБрдк рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ рдФрд░ рдХрдореНрдкреЛрдЬрд╝ рдореЗрдВ рдПрдирд╛рд▓реЙрдЧреНрд╕ рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред


рдлреНрд░реЗрдорд▓реИрдЯ рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рд╕реНрдЯреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ: рдмрдЪреНрдЪреЗ рд╡рд┐рдЧреЗрдЯреНрд╕ рдУрд╡рд░рд▓реИрдк рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрд▓рдЧреНрдирдХ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реНрдерд┐рдд рд╣реЛрддреЗ рд╣реИрдВ: рдЧрдардмрдВрдзрди, рддреИрдирд╛рдд рдпрд╛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рддред


рд░реИрдЦрд┐рдХрдпрд░рд╛рдЙрдЯ рдХреЛ рджреЛ рд╡рд┐рдЬреЗрдЯреНрд╕ рджреНрд╡рд╛рд░рд╛ рддреБрд░рдВрдд рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдПрдВрдбреНрд░реЙрдЗрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдХреЙрд▓рдо рдФрд░ рд░реЛ: рдУрд░рд┐рдПрдВрдЯреЗрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ред рд╡реЗ, рдмрджрд▓реЗ рдореЗрдВ, рдлреНрд▓реЗрдХреНрд╕рдХреЛрд▓реНрдпреВрдо рдФрд░ рдлреНрд▓реЗрдХреНрд╕рд░реЛ рдореЗрдВ рдПрдХ рдиреЗрд╕реНрдЯреЗрдб рд╕рдмрдЯреНрд░реА рдкрд░ рдЕрдирдореНрдп рдлрд╝рдВрдХреНрд╢рди рдХреА рдПрдХ рдкрд░рдд рдХреЗ рд╕рд╛рде рд╣реЛрддреЗ рд╣реИрдВред рдЦреИрд░, FlexColumn рдФрд░ FlexRow рдЦреБрдж рдлреНрд▓реЗрдХреНрд╕ рдкрд░ рдкреИрд░рд╛рдореАрдЯрд░ orientation = LayoutOrientation.Vertical рдпрд╛ Horizontal рд╕рд╛рде рдмрдирд╛рдП рдЧрдП рд╣реИрдВред


FlowColumn, FlowRow рдФрд░ Flow рд╡рд┐рдЧреЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рди рдкрджрд╛рдиреБрдХреНрд░рдоред рдЙрдирдХрд╛ рдореБрдЦреНрдп рдЕрдВрддрд░: рдпрджрд┐ рд╕рд╛рдордЧреНрд░реА рдПрдХ рд╕реНрддрдВрдн рдпрд╛ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рддреЛ рдЕрдЧрд▓рд╛ рдПрдХ рдЕрдЧрд▓рд╛ рдЦреАрдВрдЪрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдПрдореНрдмреЗрдбреЗрдб рд╡рд┐рдЬреЗрдЯ "рд╡рд╣рд╛рдВ" рдкреНрд░рд╡рд╛рд╣ рдХрд░реЗрдВрдЧреЗред рдЗрди рд╡рд┐рдЧреЗрдЯреНрд╕ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрджреНрджреЗрд╢реНрдп рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рдХрдард┐рди рд╣реИред


рд╕реНрдХреНрд░реЙрд▓рд╡реНрдпреВ рдкреНрд░рднрд╛рд╡ рд╡рд░реНрдЯрд┐рдХрд▓рд╕реНрдХреЙрд▓рд░ рдпрд╛ рд╣реЙрд░рд┐рдЬрд╝реЙрдиреНрдЯрд▓рд╕реНрд░реЛрд▓рд░ рдХреЗ рдЕрдВрджрд░ рдПрдХ рдХреЙрд▓рдо рдпрд╛ рд░реЛ рд░рдЦрдХрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡реЗ рджреЛрдиреЛрдВ рд╕реНрдХреНрд░реЛрд▓рд░ рдХреЗ рдЕрдВрджрд░ рд░рдЪрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдЙрддреНрддреАрд░реНрдг рд╣реЛрддрд╛ рд╣реИ isVertical = true рдпрд╛ false ред


ConstraintLayout рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдирд╛рд▓реЙрдЧ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ, рдпрд╛ рдХрдо рд╕реЗ рдХрдо RelativeLayout рдПрдХ рдирдП рдЯреЗрдмрд▓ рд╡рд┐рдЬреЗрдЯ рдореЗрдВ рдЖрдпрд╛ред рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдирдореВрдирд╛ рдХреЛрдб рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА: DataTableSamples.kt ред рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА, рдпрд╣ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ред


рдЫрд╡рд┐

рд░рд╛рдЬреНрдп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ


рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд╕рдмрд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдирд╡рд╛рдЪрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдПрдХрд▓ рд░рд╛рдЬреНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирд┐рд░реНрдорд┐рдд рдпреВрдирд┐рдбрд╛рдпрд░реЗрдХреНрд╢рдирд▓ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдЗрд╕рдХреА рддрддреНрдкрд░рддрд╛ рд╣реИред рдФрд░ рдпрд╣ рдЯреИрдЧ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП @Model рдПрдиреЛрдЯреЗрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдерд╛ рдЬреЛ UI рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╛рдЬреНрдп рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:


 data class DialogVisibleModel(val visible: Boolean, val dismissPushed: Boolean = false) ... @Composable fun SideBySideAlertDialogSample() { val openDialog = +state { DialogVisibleModel(true) } Button(text = "Ok", onClick = { openDialog.value = DialogVisibleModel(true) }) if (openDialog.value.visible) { AlertDialog( onCloseRequest = { // Because we are not setting openDialog.value to false here, // the user can close this dialog only via one of the buttons we provide. }, title = { Text(text = "Title") }, text = { Text("This area typically contains the supportive text" + " which presents the details regarding the Dialog's purpose.") }, confirmButton = { Button("Confirm", onClick = { openDialog.value = DialogVisibleModel(false) }) }, dismissButton = { if (!openDialog.value.dismissPushed) Button("Dismiss", onClick = { openDialog.value = DialogVisibleModel(true, true) }) else { //hidden } }, buttonLayout = AlertDialogButtonLayout.SideBySide ) } } 

рдпрд╣ рд░рд╛рдЬреНрдп рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдбреЗрдЯрд╛ рд╡рд░реНрдЧ рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ @Model рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЕрд╡рд╕реНрдерд╛ рд╕реНрд╡рдпрдВ @ рдХреЙрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдИ рдЧрдИ рд╣реИред
рд╕рдВрд╡рд╛рдж рдХреА рджреГрд╢реНрдпрддрд╛ рдореВрд▓реНрдп рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдореЙрдбрд▓ рдХреА рджреГрд╢реНрдп рд╕рдВрдкрддреНрддрд┐ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддреА рд╣реИред
рдЗрд╕ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдПрдХ рдирдИ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╡рд╕реНрддреБ рдкрд░ рднреА рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рджреЛрдиреЛрдВ рдмрдЯрди рдХреЗ рдСрдирдХреНрд▓рд┐рдХ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рдкрд╣рд▓рд╛ рдЦреБрдж рдХреЛ рдЫреБрдкрд╛рддрд╛ рд╣реИ, рджреВрд╕рд░рд╛ - рд╕рдВрд╡рд╛рдж рдХреЛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИред рдУрдХреЗ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдбрд╛рдпрд▓реЙрдЧ рдХреЛ рдлрд┐рд░ рд╕реЗ рдУрдкрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдЙрд╕реА @ рдХрдореНтАНрдкреНтАНрдпреВрдЯрд░ рдлрдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд╛рд╣рд░ рдПрдХ рд░рд╛рдЬреНрдп рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╕рдордп, рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ:
java.lang.IllegalStateException: Composition requires an active composition context.
рд╕рдВрджрд░реНрдн onCreateView рдореЗрдВ setContent {} рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рди рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдерд┐рддрд┐ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рдпрд╛ рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рдпрд╛ рдЕрдиреНрдп рд╡рд░реНрдЧ рдореЗрдВ, рдЕрднреА рднреА рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИред


рдЫрд╡рд┐

рдпрд╣ рдирдП Jetpack Compose рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рд╣рдорд╛рд░реА рд╕рдореАрдХреНрд╖рд╛ рдХрд╛ рд╕рдорд╛рдкрди рдХрд░рддрд╛ рд╣реИред рдврд╛рдВрдЪрд╛ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рд╕рд╛рде рд╡реНрдпреВ рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рдмрд╣реБрдд рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдерд╛, рдЬреЛ рд╕рднреА рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдХреА рдЬрдЧрд╣, рдЙрд╕рдХреЗ рдирд╛рдо рдХреЛ рд╕рд╣реА рдард╣рд░рд╛рддрд╛ рд╣реИред рдЕрднреА рднреА рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкреНрд░рд╢реНрди рд╣реИрдВ рдХрд┐ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ ViewGroups рдХрд╛ рдПрдирд╛рд▓реЙрдЧ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреИрд╕реЗ рдХрд┐ ConstraintLayout рдФрд░ RecyclineView; рдкрд░реНрдпрд╛рдкреНрдд рджрд╕реНрддрд╛рд╡реЗрдЬ рдФрд░ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдирд╣реАрдВред


рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЫреЛрдЯреЗ рд▓рдбрд╝рд╛рдХреВ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рднреА рдХрдВрдкреЛрдЬ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИред


рд▓реЗрдХрд┐рди рдпрд╣ рджреЗрд╡ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдХрд╛ рдкрд╣рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реИред рдХрдореНрдкреЛрдЬрд╝ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рдореБрджрд╛рдп рд╕реЗ рд░рд╛рдЬреНрдп рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ред


рдпрджрд┐ рдЖрдкрдХреЛ рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдб, рдпрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЗ рдЕрдзрд┐рдХ рд╕рдлрд▓ рдЙрджрд╛рд╣рд░рдг рдорд┐рд▓рддреЗ рд╣реИрдВ, рдЬреЛ рдореБрдЭреЗ рдирд╣реАрдВ рдорд┐рд▓реЗ, рддреЛ рдХреГрдкрдпрд╛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд▓рд┐рдЦреЗрдВред

Source: https://habr.com/ru/post/hi471670/


All Articles