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