0%

第3章:软件和也要拼脸蛋

布局文件中如果添加Button,并指定其text为”button”的话,但是显示的是”BUTTON”,全部变为大写了,要去掉这一效果,可以添加属性android:textAllCaps=”false”

RelativeLayout 中还有另外一组对于控件进行定位的属性,android:layout_alignLeft表示让一个控件的左边缘和另一个控件的左边缘对齐,同理,还有android:layout_alignRight、Top、Bottom 。

创建自定义控件

我们所用的所有控件都是直接或者间接继承自View的,所有的布局都是直接或者间接继承ViewGroup,View是Android中最基本的一种UI组件,它可以在屏幕上绘制一块矩形区域,并能响应这块区域的各种事件,因此,我们使用的各种控件其实就是在View的基础上添加各自特有功能;而ViewGroup则是一种特殊的View,它可以包含很多子View和子ViewGroup,是一个防止控件和布局的容器。常用控件和布局的继承结构如下图所示:

view继承关系

App中的标题栏几乎在每个界面都是一样的,除了标题不一样,其他的诸如左边按钮点击就finish当前页面,右边的是菜单按钮,这些功能基本上一样,如果在每个页面都单独为这些按钮重复添加相同的监听,比较繁琐。所以可以将标题栏单独封装成单独的一个TitleLayout的,每次只需要引入到布局中即可。

使用listview

可以继承ArrayAdapter简化操作,类似如下(当然,这里在getView的时候没有进行复用优化,仅仅只是示例):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class FruitAdapter extends ArrayAdapter<Fruit>{
private int resourceId;

public FruitAdapter(Context context,int resourceId,List<Fruit> objects){
super(context,resourceId,objects);
this.resourceId = resourceId;
}

@Override
public View getView(int position,View convertView,ViewGroup parent){
Fruit fruit = getItemt(position);
View view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false);
ImageView ivFruit = view.findViewById(R.id.img);
TextView tvFruit = view.findViewById(R.id.txt);
ivFruit.setImageResource(fruit.getImageId());
tvFruit.setText(fruit.getName());
return view;
}
}

使用更强大的RecyclerView

在设置LayoutManager的时候,可以指定排布的方向比如以下代码:

1
2
LinearLayoutManager manager = new LinearLayoutManager(this);
manager.setOrientation(LinearLayoutManager.HORIZONTAL);//平时一般使用竖直方向,这里特意指定横向

为什么Listview很难或者根本无法实现这种效果呢,其实这主要得益于RecyclerView的出色设计,ListView的布局排列是由自身去管理的,,而RecyclerView则将这个工作交给了LayoutManager,LayoutManager指定了一套可扩展的布局排列接口,自雷只要按照接口的规范来实现,就能定制出不同排列方式的布局了。

实现点击事件,可以在Adapter中的onCreateViewHolder方法中来做到,诸如以下实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent,int viewType){
View view = LayoutInflater.from(parent.getContext).inflate(R.layout.fruit_item,parent,false);
final ViewHolder holder = new ViewHolder(view);
holder.ivFruit.setOnclickListener(new View.OnclickListener(){
@Override
public void onClick(View v){
int postion = holder.getAdapterPosition();
//doSomeThing you want
}
});
}

谢谢你的鼓励