3

我正在尝试学习如何使用 Kotlin/Anko。

我已经浏览了这里的示例,还克隆了模板项目,并且可以理解如何做一些基本的事情,但作为练习,我想将这个简单的活动(从 Android Studio 中的空白活动生成并转换为 Kotlin)转换为使用安哥也是。关于 Anko 的例子并不多,大多数只是上面引用的 github 页面上的内容的副本。

有人可以演示如何将以下内容转换为 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>
4

2 回答 2

6

您可以使用方法在 DSL 上下文ankoView中创建没有 DSL 方法的 s。View

例如,要创建NavigationView一个可以使用

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

这样您就可以实例化FloatingActionButtonand ,只需在的第一个参数函数中AppBarLayout调用它们的构造函数。ankoView为方便起见,您可以像手册中那样制作类似 DSL 的功能:

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

创建一个Toolbar更容易:toolbarorg.jetbrains.anko.appcompat.v7.


使用 Anko DSL 时,要包含另一个布局,就像content_mainincludeViewGroup. 您可以使用此模板:

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

然后只需myLayout()在一些ViewGroup初始化程序中调用。

于 2015-12-11T15:03:21.690 回答
3

我知道答案有点晚了,但我希望它对某人有所帮助。我以这种方式进行了布局(当然仍然需要一些样式):

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)
            }
        }
    }
}

并像这样在 MainActivity 中使用:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    MainUI(MainUIAdapter(people)).setContentView(this)

    toolbar = find<Toolbar>(R.id.toolbar)
    setSupportActionBar(toolbar)
}
于 2017-03-09T01:20:54.283 回答