一、常用控件
1.TextView(文本)
- match_parent:控件与父类相同(基本不用fil_parent)wrap_content:刚好包裹里面内容。
- android:gravity调节文字对齐方式,可选参数包括top、bottom、left、right、center等。可用|来同时指定多个值。文字采用sp为单位,文字颜色使用#XXXXXX来表示。
- android:textSize 属性可以指定文字的大小,通过 android:textColor 属性可以指定文字的颜色。
2.Button(按钮)
Button可以通过注册监听器调用,也可以通过实现接口的方式实现调用。
- button.setOnClickListener(new OnClickListener(){})
- 或者让活动类实现
OnClickListener
接口,重写onclick方法onClick(View v)
,可以通过参数v的id判断是哪一个按钮。
3.EditText(编辑框)
- android.hint:指定一段提示性文字
- android:maxLines指定EditText的最大行数
- editText_01.getText().toString()来获取输入内容。
4.ImageView(图片控件)
- android:src为ImageView指定一张照片。
- setImageResource()动态设置ImageView里面的图片。
5.ProgressBar(进度条)
- Android:visibility设置控件可见属性,visible可见invisible不可见,gone消失。设置控件可见性setVisiblity(View.visible);获取控件可见性progress_bar01.getVisiblity()
- 设置Prograssbar的进度条进度。 progressBar.getProgress()获得进度,progressBar.setProgress(progress)设置进度。
6.AlterDialog(对话框)
- 一般 AlertDialog 都是用于提示一些非常重要的内容或者警告信息。
- 先new一个AlterDialog.Builder对象,setTitle、setMessage、SetCancelable、setPositiveButton、setNegativeButton完成。
- 最后一定要dialog.show();
7.ProgressDialog
- ProgressDialog 会在对话框中显示一个进度条,一般是用于表示当前操作比较耗时,让用户耐心地等待。
- 与AlterDialog类似,设置progressdialog.setCaceled(true),可通过返回键back回去,否则回不去.
二、四种基本的布局
1.线性布局(Linearlayout)
- android:orientation="vertical"竖直方向。horizontal水平方向。
- android:gravity 用于指定文字在控件中的对齐方式,而android:layout_gravity用于指定控件在布局中的对齐方式。
- .dp是Android中用于指定控件大小、间距等属性 , android:layout_width=“0dp” android:layout_weight="1"若两个控件都为1则平分屏幕。
2.相对布局 (RelativeLayout)
- 相对父布局定位:
//控件位于父控件的右下方
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
//两个属性来确定置。
- 相对于控件定位
//控件位于button_03控件的右下方
android:layout_below="@id/button_03"
android:layout_toRightOf="@id/button_03"
3.帧布局 (FrameLayout)
应用场景较少,将元素放在左上方
4.百分比布局(PercentFrameLayout)
三、自定义控件
控件的继承结构
需求,添加一个类似苹果的菜单栏,左边是返回按钮,中间是内容,右边是编辑
- 自定义布局
在res/layout 新建一个布局文件 title.xml,
然后在需要引入这个布局的xml文件中加上<include layout="@layout/title"/>
就可以了。
- 自定义控件
每次引入Title.xml 点击事件都要写,不如改成动态加载形成自定义控件。
- 上一步引入布局后;
- 新建TitleLayout继承自LinearLayout,对标题栏动态加载
public class TitleLayout extends LinearLayout {
public TitleLayout(Context context, AttributeSet attrs) {
super(context, attrs);
LayoutInflater.from(context).inflate(R.layout.title, this);
}
}
- 3.重新引入布局,引入TitleLayout,而非title.xml;
<com.example.uicustomviews.TitleLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
</com.example.uicustomviews.TitleLayout>
- 4.在布局的构造函数中中添加点击事件,形成自定义控件。
public class TitleLayout extends LinearLayout {
public TitleLayout(Context context, AttributeSet attrs) {
super(context, attrs); LayoutInflater.from(context).inflate(R.layout.title, this);
Button titleBack = (Button) findViewById(R.id.title_back);
Button titleEdit = (Button) findViewById(R.id.title_edit); titleBack.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
((Activity) getContext()).finish();
}
});
titleEdiOnCt.setlickListener(new OnClickListener();
}
}
四、ListView
简单用法
- 在一个布局中中加入ListView
<ListView
android:id="@+id/list_view" android:layout_width="match_parent" android:layout_height="match_parent" >
</ListView>
- 提供显示数据
private String[] data = { "Apple", "Banana", "Orange", "Watermelon", "Pear", "Grape", "Pineapple", "Strawberry", "Cherry", "Mango" };
- 构建适配器,目的是传递数据进入ListView,适配器是ArrayAdapter,可以通过泛型传递数据。
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
MainActivity.this, android.R.layout.simple_list_item_1, data);
这里我们使用了android.R.layout.simple_list_item_1 作为 ListView 子项布局的 id,这是一个 Android 内置的布局文件,里面只有一个TextView,可用于简单地显示一段文本。
3.setAdapter将适配器传递进去,完成Listview与数据的关联。
listView.setAdapter(adapter);
高级用法(定制ListView的界面)
- 定义实体类Fruit,传入ImageId和name;
public class Fruit {
private String name;
private int imageId;
}
2.建立Fruit_item.xml,完善布局;
定义了一个 ImageView 用于显示水果的图片, 又定义了一个TextView 用于显示水果的名称
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" >
<ImageView android:id="@+id/fruit_image" android:layout_width="wrap_content" android:layout_height="wrap_content" />
<TextView android:id="@+id/fruit_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginLeft="10dip" />
</LinearLayout>
3.建立自定义适配器,继承ArrayAdapter,泛型为Fruit类,FruitAdapter将上下文、ListView子布局的id和数据传递进来。
public class FruitAdapter extends ArrayAdapter<Fruit> {
private int resourceId;
public FruitAdapter(Context context, int textViewResourceId, List<Fruit> objects) {
super(context, textViewResourceId, objects);
resourceId = textViewResourceId;
}
}
4.重写getView方法,其功能是每个子项滚动到屏幕内的时候会被调用。
- 获取当前项的Fruit实例;L
- ayoutInflater.from(getContext()).inflate为这个子项加载传入的布局;
- setImageResource和setText设置图片和文字。返回布局最后。
public View getView(int position, View convertView, ViewGroup parent) {
Fruit fruit = getItem(position); // 获取当前项的Fruit实例
View view = LayoutInflater.from(getContext()).inflate(resourceId, null); ImageView fruitImage = (ImageView) view.findViewById(R.id.fruit_image); TextView fruitName = (TextView) view.findViewById(R.id.fruit_name); fruitImage.setImageResource(fruit.getImageId()); fruitName.setText(fruit.getName());
return view;
}
5.使用initFruits初始化所有水果数据,将水果名称和水果图片ID添加进来;建立Adapter,将其作为适配器传入Listview,只要修改fruit_intem.xml,就可以修改出复杂界面了。
FruitAdapter adapter = new FruitAdapter(MainActivity.this, R.layout.fruit_item, fruitList);
private void initFruits() {
//初始化所有水果的数据;
}
- 给每个viewItem添加一个点击事件
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Fruit fruit = fruitList.get(position);
Toast.makeText(MainActivity.this, fruit.getName(),
Toast.LENGTH_SHORT).show();
}
}
- ListView的优化
getView()方法中还有一个 convertView 参数,这个可以理解成上次加载成功的view。
public class FruitAdapter extends ArrayAdapter<Fruit> {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Fruit fruit = getItem(position);
View view;
ViewHolder viewHolder;
if (convertView == null) {
view = LayoutInflater.from(getContext()).inflate(resourceId, null);
viewHolder = new ViewHolder();
viewHolder.fruitImage = (ImageView) view.findViewById (R.id.fruit_image);
viewHolder.fruitName = (TextView) view.findViewById (R.id.fruit_name);
view.setTag(viewHolder); // 将ViewHolder存储在View中
} else {
view = convertView;
viewHolder = (ViewHolder) view.getTag(); // 重新获取ViewHolder
}
viewHolder.fruitImage.setImageResource(fruit.getImageId()); viewHolder.fruitName.setText(fruit.getName());
return view;
}
class ViewHolder {
ImageView fruitImage;
TextView fruitName;
}
}
我们新增了一个内部类 ViewHolder,用于对控件的实例进行缓存。当 convertView 为空的时候,创建一个 ViewHolder 对象,并将控件的实例都存放在 ViewHolder 里,然后调用 View 的 setTag()方法,将 ViewHolder 对象存储在 View 中。当 convertView 不为空的时候则调用
View 的 getTag()方法,把 ViewHolder 重新取出。这样所有控件的实例都缓存在了 ViewHolder
里,就没有必要每次都通过 findViewById()方法来获取控件实例了。
五、长度单位怎么使用
px 是像素的意思,即屏幕中可以显示的最小元素单元,在像素不同的设备显示的大小会有出入。pt字体单位同理。
dp 是密度无关像素,比如手机宽是 2 英寸长是 3 英寸,如果它的分辨率是 320*480 像素,那么他的密度比是160dpi。pt字体单位同理。
总结一下,在编写 Android 程序的时候,尽量将控件或布局的大小指定成 match_parent 或 wrap_content,如果必须要指定一个固定值,则使用 dp 来作为单位,指定文字大小的时候使用 sp 作为单位。