第四章 软件也要拼脸蛋,UI开发的点点滴滴

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中通过

自定义控件:首先有一个布局文件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): RecyclerView.Adapter() {
    //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
    }

第四章 的实践 :编写出一个较为复杂且相当美观的聊天界面第四章 软件也要拼脸蛋,UI开发的点点滴滴_第1张图片

开始

你可能感兴趣的:(ui)