前言
学习了几天的kotlin语法,就迫不及待的使用kotlin语言写了Android小Demo,途中还是遇到一些困难,其中也有没解决的..希望大神看到能多多指点.
我只是简单的搭建了一个架构。。废话不多说,直接上代码。这是布局代码:
<?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
是该activity
或fragmeng
的布局名称。但是在activity
或fragment
中出现了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个数。
网友评论