第三章——UI开发的点点滴滴
3.2常用控件的使用方法
所有Android控件都可以使用的控制显隐属性:【visibility】有三个值:【visible】【invisible】【gone】;代码设置方式:【SetVisibility】,参数:【View.VISIBLE】【View.INVISIBLE】【View.GONE】
TextView 用于显示文本。有【id】【layout_width】[layout_height][gravity][]textSize][textColor][text]等属性。
Button 按钮。比textView多一个【textAllCaps】属性,默认为true,即所有英文字母都会转成大写字母,如果你不想就设为false。监听分为匿名函数和实现接口两种,写法有区别,大同小异。
EditText 编辑文本。有【hint】属性(提示文言)、【maxLines】属性,设置最大行数;可以通过【getText】方法获取输入内容(之后可以用【toString()】方法转为字符串);
ImageView 【src】设置图片、也可以在代码中通过【setImageResource()】方法设置图片。
ProgressBar 用于在用户界面显示一个进度条,【style】属性可以设置改变进度条样式(转圈的、进度的等)。【android:max】可以设置进入条最大值。比如:
<ProgressBar android:id="@+id/ProgressBar_1" android:layout_width="match_parent" android:layout_height="wrap_content" style="?android:attr/progressBarStyleHorizontal" android:max="100" />
这样在代码中就能动态设置进度条进度了:
public void onClick(View v) { switch(v.getId()){ case R.id.button_1: int iProgess = progressBar.getProgress(); iProgess += 10; progressBar.setProgress(iProgess); break; default: break; }
AlertDialog 提示对话框,对话框层位于元素图层的最上方,能屏蔽掉下面图层的交互能力。使用方法如下(点击按钮弹出一个dialog):
public void onClick(View v) { switch(v.getId()){ case R.id.button_1: AlertDialog.Builder dialog = new AlertDialog.Builder(SecondActivity.this); dialog.setTitle("this is a dialog");//设置标题 dialog.setMessage("Something important");//设置提示内容 dialog.setCancelable(false);//是否能使用bach按钮关闭 dialog.setPositiveButton("OK",new DialogInterface.OnClickListener(){ public void OnClick(DialogInterface dialog, int iwhich){} });//确定按钮的点击事件 dialog.setNegativeButton("Cancle",new DialogInterface.OnClickListener(){ public void OnClick(DialogInterface dialog, int iwhich){} });//取消按钮的点击事件 dialog.show(); break; default: break; }
ProgressDialog 多一个进度条,一般用于提示用户当前操作比较耗时,让用户耐心等待。用法和【AlertDialog】差不多。对话框的消掉方法【dismiss()】。
3.3详解四种布局
Linear Layout 线性布局
RelativeLayout 相对布局
FrameLayout 帧布局(就是绝对布局,所有元素默认左上角,需要挨个按像素设置位置,所以叫【帧】?)
PercentRelativeLayout和PrecentFrameLayout 百分比布局 新加的两种布局方式,在【RelativeLayout】和【FrameLayout】上做的扩展,使他们能支持百分比布局。
3.4系统控件不够用?创建自定义控件
控件和布局的继承关系:

可以看到,所有控件都继承自View,所有布局都继承自【VieeGroup】,【View】是Android中最基本的一种UI组件,它可以在屏幕上绘制一块矩形区域,并能响应这块区域上的各种事件。
3.4.1引入布局
就是新建一个使用频率很高的布局,然后在其他布局中直接引用该布局,而不是重复写该布局;具体实现过程就是
1.新建一个布局文件,里面是通用布局,比如【title.xml】
2.在其他布局中使用【<inuclude layout = "@layout/title'>】即可引用该布局。如果你引用的是一个标题栏的布局,可能还需要先隐藏掉系统自带的默认标题栏布局。隐藏方法如下:
ActionBart actionbar = getSupportActionBar(); if(action != null){ action.hide(); }
3.4.2创建自定义布局
就是为共通的布局写一个通用的响应事件,避免多个活动中重写同样的事件响应处理。具体操作如下:
pubilc class TitleLayout extends LinearLayout{ public TitleLayout(Context context, AttributeSet attrs){ super(context,attrs); LayoutInflater.from(context).inflate(R.id.title,this); } }
这样使用这个布局和使用上面的【<inuclude layout = "@layout/title'>】是一个效果,但是可以在代码中添加响应事件。xml中修改如下(效果和上面的【<inuclude layout = "@layout/title'>】一样):
<com.example.uicustomvies.TitleLayout android:layout_width = "match_parent" android:layout_height = "wrap_content" />
如果需要相应什么事件,就可以直接在上面的类中添加了,比如其中一个button的点击相应处理:
pubilc class TitleLayout extends LinearLayout{ public TitleLayout(Context context, AttributeSet attrs){ super(context,attrs); LayoutInflater.from(context).inflate(R.id.title,this); Button titleBack = (Button)FindViewById(R.id.title_back); titleBack.setOnClickListenner(new OnClickListenner(){ ... }); } }
这样布局和处理代码都实现了复用,省去了很多编写重复代码的工作量。
3.5最常用也是最难用的控件——ListView
布局xml:
<ListView android:id="@+id/list_view" android:layout_width="match_parent" android:layout_height="wrap_content" />
代码部分:
private String[] data = {"Apple","Banana","Orange"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.first_layout); ArrayAdapter<String> adapter = new ArrayAdapter<String>(FirstActivity.this, android.R.layout.simple_expandable_list_item_1,data); ListView listView = (ListView) findViewById(R.id.list_view); listView.setAdapter(adapter);
这里的【android.R.layout.simple_expandable_list_item_1】是一个Android内置的布局文件的id,里面只有一个TextView。
你也可以写一个ArrayAdapter的子类,用以加载单挑list布局,形式略。
提升ListView的运行效率:因为你写的Adapter子类的【getView()】方法每次都将布局重新加载一遍,当list快速滚动时,这就成为了性能瓶颈;你可以使用【GetView()】方法的第二个参数【View convertView】来缓存之前加载完的布局;具体方法略了。
点击事件:【onItemClick()】这是点击list的回调。代码略。
3.6更强大的滚动控件——RecyclerView
Lits性能差,不能横向滚动,过时的玩意,用【RecyclerView】吧,ListViewPlus。
使用方法书上写的很简洁,无需复写,略了。就是写一个【Adapter】写一个单条list布局,代码中一加载数据。over。

浙公网安备 33010602011771号