美文网首页Android知识
第一次使用kotlinx书写android实践

第一次使用kotlinx书写android实践

作者: 行走的老者 | 来源:发表于2017-07-14 15:01 被阅读54次

    实现效果

    列表效果

    如上图,想要kotlinx实现上面的效果,以为很简单,但却碰到不少的坑,毕竟还没学过kotlinx语法,不过最终还是弄出来了,在这里记录下。

    准备

    工欲善其事必先利其器,所以我们首先要准备好环境,在这里我使用的是AS 3.0预览版,本身就支持kotlinx,使用2.x的要装插件支持,不过我觉得使用就使用3.0吧,毕竟是亲爹支持的,新建项目什么的省了,不知道的google下...

    开发

    MainActivity.kt

    import android.os.Bundle
    import android.support.design.widget.Snackbar
    import android.support.v7.app.AppCompatActivity
    import android.view.Menu
    import android.view.MenuItem
    import kotlinx.android.synthetic.main.activity_main.*
    
    class MainActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            setSupportActionBar(toolbar)
    
            supportFragmentManager.beginTransaction()
                    .add(R.id.fragment, MainActivityFragment(), "MainActivityFragment")
                    .commit();
    
            fab.setOnClickListener { view ->
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show()
            }
        }
    
        override fun onCreateOptionsMenu(menu: Menu): Boolean {
            // Inflate the menu; this adds items to the action bar if it is present.
            menuInflater.inflate(R.menu.menu_main, menu)
            return true
        }
    
        override fun onOptionsItemSelected(item: MenuItem): Boolean {
            // Handle action bar item clicks here. The action bar will
            // automatically handle clicks on the Home/Up button, so long
            // as you specify a parent activity in AndroidManifest.xml.
            return when (item.itemId) {
                R.id.action_settings -> true
                else -> super.onOptionsItemSelected(item)
            }
        }
    }
    

    这里要注意下,由于kotlinx与java的语法风格不一样,所以要特别注意:

    1. 继承不再写extends,而是直接:表示;
    2. 使用类里面的成员或方法时,直接 supportFragmentManager.beginTransaction(),而不再 getSupportFragmentManager().beginTransaction(),很简洁;
    3. 获取控件时,没有了findViewById,而是直接使用id来引用,不过这里要注意,引入的时候记得引入import kotlinx.android.synthetic.main.activity_main.*这个。

    activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.design.widget.CoordinatorLayout
        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"
        tools:context="com.jhworks.rxjavademo.MainActivity">
    
        <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>
    
        <FrameLayout android:id="@+id/fragment"
                 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"
                 app:layout_behavior="@string/appbar_scrolling_view_behavior"
                 />
        <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"
            app:srcCompat="@android:drawable/ic_dialog_email"/>
    </android.support.design.widget.CoordinatorLayout>
    

    MainActivityFragment.mk

    import android.os.Bundle
    import android.support.v4.app.Fragment
    import android.support.v7.widget.LinearLayoutManager
    import android.view.LayoutInflater
    import android.view.View
    import android.view.ViewGroup
    import kotlinx.android.synthetic.main.fragment_main.*
    
    /**
     * A placeholder fragment containing a simple view.
     */
    class MainActivityFragment : Fragment() {
    
        override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                                  savedInstanceState: Bundle?): View? {
            return inflater.inflate(R.layout.fragment_main, container, false)
        }
    
        override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
    
            recycler_view.layoutManager = LinearLayoutManager(context)
    
            val list = ArrayList<String>()
            var i: Int = 0
            while (i < 10) {
                list.add("item---" + i)
                i++
            }
            val adapter = ListAdapter(context)
            recycler_view.adapter = adapter
            adapter.setDataList(list)
        }
    }
    

    ListAdapter.kt

    import android.content.Context
    import android.support.v7.widget.RecyclerView
    import android.view.LayoutInflater
    import android.view.ViewGroup
    
    /**
     * @author LiaoJH
     * @VERSION 1.0
     * email: 583125288@qq.com
     * @DESC TODO
     */
    class ListAdapter(context: Context) : RecyclerView.Adapter<ListHolder>() {
        private var mLayoutInflate: LayoutInflater = LayoutInflater.from(context)
        private var mDataList: List<String>? = null
    
        fun setDataList(dataList: List<String>) {
            mDataList = dataList
        }
    
        override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ListHolder {
            return ListHolder(mLayoutInflate.inflate(R.layout.list_item_layout, parent, false))
        }
    
        override fun getItemCount(): Int {
            if (mDataList == null) return 0
            else
                return mDataList?.size as Int
        }
    
        override fun onBindViewHolder(holder: ListHolder?, position: Int) {
    
            holder?.bindData(mDataList?.get(position) as String)
        }
    
    }
    

    list_item_layout.xml

    <?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="wrap_content"
                  android:orientation="vertical">
    
        <TextView
            android:id="@+id/name_tv"
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:paddingLeft="20dp"
            android:gravity="center_vertical"
            android:text="Item"
            />
    </LinearLayout>
    

    ListHolder.kt

    import android.support.v7.widget.RecyclerView
    import android.view.View
    import android.widget.TextView
    
    /**
     * @author LiaoJH
     * @VERSION 1.0
     * email: 583125288@qq.com
     * @DESC TODO
     */
    class ListHolder(itemView: View?) : RecyclerView.ViewHolder(itemView) {
        private var mNameTv: TextView = itemView?.findViewById(R.id.name_tv) as TextView
    
        fun bindData(name: String) {
            mNameTv.text = name
        }
    }
    

    这样就能实现开头的效果了,第一次使用kotlinx,还是有不少坑,在此记录下。

    相关文章

      网友评论

        本文标题:第一次使用kotlinx书写android实践

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