1.常用控件
- TextView:android:layout_width和android:layout_height指定了控件的宽度和高度。Android中所有的控件都具有这两个属性,可选值有3种:match_parent、wrap_content和固定值dp。文字对齐方式gravity有top、bottom、start、end、center等,可以用“|”来同时指定多个值,这里我们指定的是"center",效果等同于"center_vertical|center_horizontal"。文字颜色textcolor,文字大小textSize单位sp
- Button:文字默认大写 --> android:textAllCaps="false"。监听点击click:两种方式,获取当前按钮,添加点击监听。实现view.OnClickListener接口,在onClick方法里判断点击是否为当前按钮。 可以set多个listener,相同的listener只会保留最后一个。
- EditText:可以添加指定高度maxLines,添加提示 hint,获取输入的字符 .text.toString()。
- ImageView: 可以更改图片,setImageResource
- ProcessBar: 可见,不可见,销毁 Visibility = visible、invisible和gone,通过style设置为水平,通过设置max,通过progress + 提高进度条
- AlertDialog 弹出框
2.常用布局
- LinearLayout:
- 内部组件排列方向 orientation有vertical,horizontal
- 内部组件可以设置对齐方向 layout_gravity:
- 内部组件的大小占比 layout_weight 权重
- RelativeLayout:
- 相对于父布局定位
- 相对于组件定位
- FrameLayout 帧布局
自定义布局: 先在layout文件中定义一个布局,然后在activity对应的layout中通过<include layout="" 导入
自定义控件:首先有一个布局文件layout.xml, 然后创建一个类 继承 布局文件中的root 布局类,然后通过LayoutInflater.from(context).inflate(R.layout.title, this)将本类 绑定当前布局
ListView:使用,由ListView标签和一个ListView_item布局, 使用一个adapter来绑定ListView的activity和ListView_item和数据。然后设置listvew的adapter为当前的adapter。绑定list view_item和数据的逻辑在adapter类内编写,一般需要继承ArrayAdapter,重写getView方法。
ListView的优化:1.使用getView提供的View对view进行复用 2. 使用ViewHolder 复用组件
绑定item事件 view.setOnItemClickListener()
RecyclerView:使用 1.布局文件,一个RecycleView的文件,一个item文件。2.为RecycleView组件设置这两个 recyclerView.layoutManager (一般使用系统实现,有Linear,网格和瀑布流的实现) recyclerView.adapter (一般自己实现) 3.继承RecyclerView.Adapter实现Adapter,
class FruitAdapter4Recycler(val fruitList: List<Fruit>): RecyclerView.Adapter<FruitAdapter4Recycler.ViewHolder>() {
//RecyclerView内部维护一个ViewHolder
inner class ViewHolder(view:View):RecyclerView.ViewHolder(view){
val fruitImage: ImageView = view.findViewById(R.id.fruitImage_401)
val fruitText:TextView = view.findViewById(R.id.fruitText_401)
}
// 创建ViewHolder,通过构造函数
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.fruit_item_recycler,parent, false)
return ViewHolder(view)
}
// 绑定ViewHolder内的组件与数据
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val fruit = fruitList[position]
holder.fruitText.text = fruit.name
holder.fruitImage.setImageResource(fruit.imageId)
}
override fun getItemCount(): Int {
return fruitList.size
}
}
bug:打开后是正常的,当开始滑动后,每个item都会变为占据整个屏幕。(解决
引用了ListView的item的xml,其内部由ConstraintLayout嵌套的LinearLayout可能是出错了,将R.layout.fruit_item改为fruit_item_recycler,并将外层改为只有LinearLayout,bug消失。
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.fruit_item,parent, false)
return ViewHolder(view)
}
绑定item事件:让所有的点击事件都由具体的View去注册,在onCreateViewHolder()方法中注册点击事件
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.fruit_item_recycler,parent, false)
val viewHolder = ViewHolder(view)
viewHolder.itemView.setOnClickListener {
val position = viewHolder.absoluteAdapterPosition
val fruit = fruitList[position]
Toast.makeText(parent.context, "you click view ${fruit.name}", Toast.LENGTH_SHORT).show()
}
viewHolder.fruitImage.setOnClickListener {
val position = viewHolder.absoluteAdapterPosition
val fruit = fruitList[position]
Toast.makeText(parent.context, "you click image ${fruit.name}", Toast.LENGTH_SHORT).show()
}
return viewHolder
}
第四章 的实践 :编写出一个较为复杂且相当美观的聊天界面