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) } 
  • Extensión sintética Kotlin para ver
  • Tipo de parámetro Kotlin no coincide
  • Click listener en ViewHolder solo responde a veces
  • Referencia no resuelta: kotlinx
  • ¿Qué significa la advertencia «Usar properties de los packages de variante de compilation»?
  • Comunicación de extensión Kotlin-android entre classs similar a la comunicación con otros fragments
  • Cómo usar null con kotlin @Parcelize
  • Cómo inicializar widgets en Android usando kotlin
  • ¿Por qué la configuration de OnClickListener funciona una vez?
  • Compara una vista de text con una string en Kotlin
  • El conflicto de las properties sintéticas de Kotlin