Android之初学kotlin

2018-05-02  本文已影响0人  啊哟瑞迪

前言

学习了几天的kotlin语法,就迫不及待的使用kotlin语言写了Android小Demo,途中还是遇到一些困难,其中也有没解决的..希望大神看到能多多指点.

在Android studio升级到3.0以后,IDE自带Kotlin语言,在新建项目时勾选即可 勾选即可

我只是简单的搭建了一个架构。。废话不多说,直接上代码。这是布局代码:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <RadioGroup
        android:id="@+id/main_rg"
        android:layout_width="match_parent"
        android:layout_height="45dp"
        android:layout_alignParentBottom="true"
        android:orientation="horizontal">
        <RadioButton
            android:id="@+id/main_rb_home"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:button="@null"
            android:gravity="center"
            android:text="@string/main_home" />
        <RadioButton
            android:id="@+id/main_rb_product"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:button="@null"
            android:gravity="center"
            android:text="@string/main_product" />
        <RadioButton
            android:id="@+id/main_rb_bill"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:button="@null"
            android:gravity="center"
            android:text="@string/main_bill" />
        <RadioButton
            android:id="@+id/main_rb_mine"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:button="@null"
            android:gravity="center"
            android:text="@string/main_mine" />
    </RadioGroup>
    <View
        android:id="@+id/main_line"
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:layout_above="@+id/main_rg"
        android:background="@color/colorAccent" />
    <FrameLayout
        android:id="@+id/main_fl"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/main_line" />
</RelativeLayout>
MainActivity效果图

MainActivity代码:

class MainActivity : AppCompatActivity() {

    var listFragment: ArrayList<Fragment>? = null
    private lateinit var radioGroup: RadioGroup
    var lastIndex = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        listFragment = ArrayList<Fragment>()
        listFragment!!.add(HomeFragment())
        listFragment!!.add(ProductFragment())
        listFragment!!.add(BillFragment())
        listFragment!!.add(MineFragment())

        val beginTransaction = supportFragmentManager.beginTransaction()
        for (i in 0..(listFragment!!.size - 1)) {
            beginTransaction.add(R.id.main_fl, listFragment!![i])
            beginTransaction.hide(listFragment!![i])
        }

        beginTransaction.show(listFragment!![0])
        beginTransaction!!.commit()

        radioGroup = findViewById(R.id.main_rg)
         //对RadioGroup设置监听 参数类型需按照文档中类型填写,数量、类型及位置不能错,用不到的参数可用下划线代替
        radioGroup.setOnCheckedChangeListener(RadioGroup.OnCheckedChangeListener { _, checkedId ->
            val transaction = supportFragmentManager.beginTransaction()
            val index = when (checkedId) {
                R.id.main_rb_home -> 0
                R.id.main_rb_product -> 1
                R.id.main_rb_bill -> 2
                R.id.main_rb_mine -> 3
                else -> 0
            }

            if (lastIndex == index) return@OnCheckedChangeListener
            transaction.hide(listFragment!![lastIndex])
            transaction.show(listFragment!![index])
            transaction.commit()
            lastIndex = index
        })
    }
}

都知道使用kotlin开发Android时是可以省略findViewById这些代码,可直接根据控件Id直接使用该控件,只需在该activity或者fragment中导入import kotlinx.android.synthetic.main.activity_main.*,其中activity_main是该activityfragmeng的布局名称。但是activityfragment中出现了findViewById,就不能再直接根据控件id使用该控件了,否则会报空指针异常,编写代码时无异常,运行会报错,不知道是不是只有我自己遇到这个问题了。HomeActivity中使用了无findViewById的方式,写了一个简单的list列表。HomeFragment:

class HomeFragment : BaseFragment() {
    lateinit var button: Button
    override fun getViewID(): Int {
        return R.layout.fragment_home
    }
    override fun initView() {
        button = root!!.findViewById(R.id.button)
        //跳转到HomeActivity
        button.setOnClickListener { startActivity(Intent(context, HomeActivity()::class.java)) }
    }
    override fun onStart() {
        super.onStart()
    }
    override fun initData() { }
    override fun initEvent() { }
}

HomeActivity:

class HomeActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_home)
        initView()
    }
    //初始化控件  
    private fun initView() {
        val adapter = ListViewAdapter(this, getListContent())
        listView.adapter = adapter
        listView.setOnItemClickListener { _, _, position, _ ->
            Constants().tool(this, getListContent()[position])
        }
        var string :String = ""
        Log.e("tag",""+string)
    }

    /**
     * 可通过网络请求获取数据
     */
    private fun getListContent(): ArrayList<String> {
        val arrayList: ArrayList<String> = ArrayList()
        for (i in 1..9) arrayList.add("条目$i")
        return arrayList
    }
}

activity_home:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

ListViewAdapter:

class ListViewAdapter(var context: Context, var list: ArrayList<String>) : BaseAdapter() {
    override fun getView(position: Int, convertView: View?, viewGroup: ViewGroup?): View {
        val holder: ViewHolder
        val view:View
        if (convertView == null) {
            view = LinearLayout.inflate(context, R.layout.item_list, null)
            holder = ViewHolder()
            holder.item_text = view.findViewById(R.id.item_text)
            view.tag = holder
        } else {
            view = convertView
            holder = view.tag as ViewHolder
        }

        holder.item_text.text = list[position]
        return view
    }

    class ViewHolder {
        lateinit var item_text: TextView
    }

    override fun getItem(p0: Int): Any = 0
    override fun getItemId(p0: Int): Long = 0
    override fun getCount(): Int = list.size
}
ListView效果图
item_list布局就不贴了。随便写个textView就可以了。看到这些,代码是不是简化了很多。根本看不到set和get方法了。什么。。参数里面有_? 调用父类有参函数时,如果用不到的参数,可以使用_代替,但传递的参数位置、类型和数量不能出现错误。函数有返回值时,无其他代码,可直接返回。如:override fun getCount(): Int = list.size,adapter返回item个数。
上一篇下一篇

猜你喜欢

热点阅读