Convierta la actividad principal con la barra de acciones / barra de herramientas y el button de acción flotante a Anko

Estoy tratando de aprender a usar Kotlin / Anko.

He recorrido los ejemplos aquí y también he clonado el proyecto de la plantilla y puedo entender cómo hacer algunas cosas básicas, pero como ejercicio quería convertir esta actividad simple (generada a partir de una actividad en blanco en Android Studio y convertida en Kotlin) para usar Anko también. No hay muchos ejemplos para Anko, la mayoría son solo copys de lo que está en la página de github mencionada anteriormente.

¿Alguien puede demostrar cómo avanzar y convertir lo siguiente en Anko DSL?

MainActivity.kt

import android.os.Bundle import android.support.design.widget.FloatingActionButton import android.support.design.widget.Snackbar import android.support.v7.app.AppCompatActivity import android.support.v7.widget.Toolbar import android.view.Menu import android.view.MenuItem class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val toolBar = findViewById(R.id.toolbar) as Toolbar setSupportActionBar(toolBar) val fab = findViewById(R.id.fab) as FloatingActionButton fab.setOnClickListener { view -> Snackbar.make(view, "Replace this with your own action", Snackbar.LENGTH_LONG).setAction("Action", null).show() } } override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.menu_main, menu) return true } override fun onOptionsItemSelected(item: MenuItem): Boolean { val id = item.itemId if (id == R.id.action_settings) { println("settings clicked on ") return true } return super.onOptionsItemSelected(item) } } 

main_activity.xml

 <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:popupTheme="@style/AppTheme.PopupOverlay" /> </android.support.design.widget.AppBarLayout> <include layout="@layout/content_main" /> <android.support.design.widget.FloatingActionButton android:id="@+id/fab" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|end" android:layout_margin="@dimen/fab_margin" android:src="@android:drawable/ic_dialog_email" /> </android.support.design.widget.CoordinatorLayout> 

content_main.xml

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:context="com.gmail.npnster.mykotlinfirstproject.MainActivity" tools:showIn="@layout/activity_main"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" android:id="@+id/hello" /> </RelativeLayout> 

menu_main.xml

 <menu 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" tools:context="com.gmail.npnster.mykotlinfirstproject.MainActivity"> <item android:id="@+id/action_settings" android:orderInCategory="100" android:title="@string/action_settings" app:showAsAction="never" /> </menu> 

Puede usar el método ankoView para crear View sin methods DSL dentro del context DSL.

Por ejemplo, para crear una NavigationView uno puede usar

 ankoView({ NavigationView(it) }) { lparams(width = wrapContent, height = matchParent, gravity = Gravity.START) // more initialization follows } 

De esta forma puede instanciar FloatingActionButton y AppBarLayout , simplemente llame a sus constructores dentro de la ankoView de primer argumento de ankoView . Para su conveniencia, puede hacerse funciones tipo DSL como en el manual :

 fun floatingActionButton(init: FloatingActionButton.() -> Unit) = ankoView({ FloatingActionButton(it) }, init) 

Crear una Toolbar es aún más fácil: hay un método de toolbar DSL en org.jetbrains.anko.appcompat.v7 .


Al usar Anko DSL, para include otro layout, como lo hizo con content_main , uno puede usar Anko include function o simplemente escribir una function que completará un ViewGroup . Puedes usar esta plantilla:

 fun ViewGroup.myLayout() { textView("123") // more DSL code here } 

Luego solo llame a myLayout() dentro de un inicializador de ViewGroup .

Sé que es un poco tarde para responder, pero espero que ayude a alguien. Hice el layout de esta manera (por supuesto, todavía se necesita un poco de estilo):

 class MainUI(val adapter: MainUIAdapter) : AnkoComponent<MainActivity> { override fun createView(ui: AnkoContext<MainActivity>): View = with(ui) { coordinatorLayout { fitsSystemWindows = true appBarLayout { toolbar { setTitleTextColor(Color.WHITE) // so far still needed id = R.id.toolbar }.lparams(width = matchParent, height = matchParent) }.lparams(width = matchParent) relativeLayout { id = R.id.container recyclerView { // just an example id = R.id.recycler_view adapter = this@MainUI.adapter layoutManager = LinearLayoutManager(ctx) } }.lparams(width = matchParent, height = matchParent) { behavior = ScrollingViewBehavior() } floatingActionButton { onClick { doSomething() } imageResource = R.drawable.ic_add_white_24dp // the plus sign }.lparams { gravity = Gravity.BOTTOM or Gravity.END margin = dip(16) } } } } 

y usado en MainActivity así:

 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) MainUI(MainUIAdapter(people)).setContentView(this) toolbar = find<Toolbar>(R.id.toolbar) setSupportActionBar(toolbar) } 
  • Extensiones de Kotlin para Android y fragments retenidos
  • No se pueden agregar los fragments usando la function de Extensión de Kotlin
  • ¿Por qué no está funcionando kotlin en el estudio andriod con la installation del complemento kotlin?
  • enlace de vista de android.R.id en Kotlin
  • Android Studio 3 no puede build fragments de kotlin
  • Cómo pasar los valores de actividad a otra actividad en kotlin
  • Crea controles dinámicamente en Android usando Kotlin
  • Extensiones de Kotlin / properties sintéticas: mismo object en múltiples invocaciones de Fragment.onViewCreated ()
  • Clases de Kotlin sin llaves
  • Extremadamente lento en autocompletado y análisis de código para proyectos Kotlin en Intellij IDEA
  • Problema de Kotlin Gradle