Kotlin 使用actionbar/工具栏和floatingaction按钮将MainActivity转换为Anko

Kotlin 使用actionbar/工具栏和floatingaction按钮将MainActivity转换为Anko,kotlin,kotlin-android-extensions,anko,Kotlin,Kotlin Android Extensions,Anko,我正在努力学习如何使用Kotlin/Anko 我已经阅读了示例,还克隆了模板项目,可以理解如何做一些基本的事情,但作为练习,我想将这个简单的活动(从Android Studio中的空白活动生成并转换为Kotlin)转换为使用Anko。关于Anko的例子并不多,大多数只是上面提到的github页面的副本 有人可以演示如何将以下内容转换为Anko DSL吗 MainActivity.kt import android.os.Bundle import android.support.design.w

我正在努力学习如何使用Kotlin/Anko

我已经阅读了示例,还克隆了模板项目,可以理解如何做一些基本的事情,但作为练习,我想将这个简单的活动(从Android Studio中的空白活动生成并转换为Kotlin)转换为使用Anko。关于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


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>

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

例如,要创建
导航视图
,可以使用

ankoView({ NavigationView(it) }) {
    lparams(width = wrapContent, height = matchParent, gravity = Gravity.START)
    // more initialization follows
}
通过这种方式,您可以实例化
FloatingActionButton
AppBarLayout
,只需在
ankoView
的第一个参数函数中调用它们的构造函数。为方便起见,您可以使用类似DSL的功能,如:

创建
工具栏
更容易:在
org.jetbrains.anko.appcompat.v7
中有一个DSL
工具栏
方法


当使用Anko DSL时,要包括另一个布局,就像您使用
content\u main
一样,可以使用Anko函数,也可以只编写一个函数来填充
视图组
。您可以使用此模板:

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

然后在一些
ViewGroup
初始值设定项中调用
myLayout()

我知道回答有点晚,但我希望它能帮助别人。我这样做布局(当然还需要一些样式):

class MainUI(val适配器:MainUI适配器):AnkoComponent{
覆盖趣味createView(ui:AnkoContext):视图=使用(ui){
协调布局{
fitsSystemWindows=true
appBarLayout{
工具栏{
setTitleTextColor(Color.WHITE)//到目前为止仍然需要
id=R.id.toolbar
}.lparam(宽度=匹配父对象,高度=匹配父对象)
}.lparam(宽度=匹配父对象)
相对论{
id=R.id.container
recyclerView{//只是一个例子
id=R.id.recycler\u视图
适配器=this@MainUI.adapter
layoutManager=LinearLayoutManager(ctx)
}
}.lparam(宽度=匹配父对象,高度=匹配父对象){
行为=滚动视图行为()
}
浮动操作按钮{
onClick{doSomething()}
imageResource=R.drawable.ic\u add\u white\u 24dp//加号
}.lparams{
重力=重力.BOTTOM或重力.END
边缘=倾角(16)
}
}
}
}
并用于这样的主要活动:

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

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

    toolbar = find<Toolbar>(R.id.toolbar)
    setSupportActionBar(toolbar)
}
override-fun-onCreate(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
MainUI(MainUIAdapter(people)).setContentView(此)
工具栏=查找(R.id.toolbar)
设置支持操作栏(工具栏)
}

对不起,我没有忽视这一点,我在周末被跟踪了。我确实看到了关于扩展Anko的部分,实际上我试图使用Anko制作一个工具栏,但无法使用setSupportActionBar()使io工作method@nPn,请确保使用
org.jetbrains.anko.appcompat.v7
包中的
toolbar
方法。IDE有时会弄乱导入,因此您可能希望将
import org.jetbrains.anko.appcompat.v7.toolbar编写为tbar
,并使用
tbar()
函数。这应该与
setSupportActionBar()
+1配合使用,以尝试提供帮助,但很抱歉,我在这方面没有取得进展,我想我真的需要一个好的例子。我可以让这部分工作。我最成功的方法是将UI放在一个单独的类中,比如MyMainUI,然后调用MyMainUI().setContentView(这个),但最终,我可以复制这个简单的测试用例(这只是android studio模板中的一个空白活动,并转换为Kotlin)。对不起,没有,我无法让它工作。我可能必须开始一个新的项目,然后从Anko模板项目中重新审视它。此时,我启动的项目已经过时。当我这样做时,溢出按钮仍然是黑色的。我想这是因为我没有像在XML中那样设置
theme=R.style.AppTheme.AppBarOverlay
属性。我不知道如何在安科做到这一点。很抱歉这么晚才回答,但你可以给我发邮件或介绍MWE吗?您是否正在清单中设置android:theme=“@style/AppTheme.NoActionBar”?
fun ViewGroup.myLayout() {
    textView("123")
    // more DSL code here
}
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)
            }
        }
    }
}
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

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

    toolbar = find<Toolbar>(R.id.toolbar)
    setSupportActionBar(toolbar)
}