美文网首页
Android之初学kotlin

Android之初学kotlin

作者: 啊哟瑞迪 | 来源:发表于2018-05-02 16:52 被阅读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个数。

    相关文章

      网友评论

          本文标题:Android之初学kotlin

          本文链接:https://www.haomeiwen.com/subject/rmlcrftx.html