《Android第一行代码》 第三章UI界面84-154
UI-程序界面
编写程序界面可通过一些可视化的工具,也可以通过编写xml的代码实现。
UI常见控件
- TestView:TextView 可以说是 Android 中最简单的一个控件了,它主要用于在界面上显示一段文本信息。在match_parent 表示让当前控件的大小和父布局的大小一样,也就是由父布局来决定当前控件的大小。wrap_content 表示让当前控件的大小能够刚好包含住里面的内容,也就是由控件内容决定当前控件的大小。
- Button:Button 是程序用于和用户进行交互的一个重要控件。
- EditText:EditText 是程序用于和用户进行交互的另一个重要控件,它允许用户在控件里输入和编辑内容,并可以在程序中对这些内容进行处理。
提示功能: android:hint
public class MainActivity extends Activity implements OnClickListener{
private Button button1;
private EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button1=(Button) findViewById(R.id.button1);
editText=(EditText) findViewById(R.id.edit_text);
button1.setOnClickListener(this);
// 将editText与Button相结合
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button1:
String inputData=editText.getText().toString();
Toast.makeText(MainActivity.this, inputData, Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
- ImageView:ImageView是用于在界面上展示图片的一个控件.
动态改变图片: setImageResource - ProgressBar:ProgressBar 用于在界面上显示一个进度条,表示程序正在加载一些数据。
如何才能让进度条在数据加载完成时消失呢?利用Android控件的可见属性。所有控件都有这个属性。
可见属性可以通过 android:visibility进行指定,可选值有三种,visible、invisible 和 gone。visible 表示控件是可见的,这个值是默认值,不指定 android:visibility 时,控件都是可见的。invisible 表示控件不可见,但是它仍然占据着原来的位置和大小,可以理解成控件变成透明状态了。gone 则表示控件不仅不可见,而且不再占用任何屏幕空间。还可以通过代码来设置控件的可见性,使用的是setVisibility()方法,可以传入 View.VISIBLE、View.INVISIBLE 和 View.GONE 三种值。
int progress=progressBar.getProgress();
progress=progress+10;
progressBar.setProgress(progress);
if(progressBar.getVisibility()==View.GONE) {
progressBar.setVisibility(View.VISIBLE);
}else {
progressBar.setVisibility(View.GONE);
}
- AlertDialog:AlertDialog 可以在当前的界面弹出一个对话框,这个对话框是置顶于所有界面元素之上的,能够屏蔽掉其他控件的交互能力,因此一般 AlertDialog 都是用于提示一些非常重要的内容或者警告信息。
首先通过 AlertDialog.Builder 创建出一个 AlertDialog 的实例,然后可以为这个对话框设置标题、内容、可否取消等属性,接下来调用 setPositiveButton()方法为对话框设置确定按钮的点击事件,调用 setNegativeButton()方法设置取消按钮的点击事件,最后调用 show()方法将对话框显示出来。重新运行程序,点击按钮后,
AlertDialog.Builder dialog=new AlertDialog.Builder(MainActivity.this);
dialog.setTitle("This is a dialog");
dialog.setMessage("Something important.");
dialog.setCancelable(false);
dialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
}
});
dialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
}
});
dialog.show();
- ProgressDialog:ProgressDialog 和 AlertDialog 有点类似,都可以在界面上弹出一个对话框,都能够屏蔽掉其他控件的交互能力。不同的是,ProgressDialog 会在对话框中显示一个进度条,一般是用于表示当前操作比较耗时,让用户耐心地等待。它的用法和 AlertDialog 也比较相似,修改 MainActivity 中的代码,
ProgressDialog progressDialog=new ProgressDialog(MainActivity.this);
progressDialog.setTitle("ProgressDialog");
progressDialog.setMessage("This isa progressDialog");
progressDialog.setCancelable(true);
progressDialog.show();
/*
* 注意如果在 setCancelable()中传入了 false,
* 表示 ProgressDialog 是不能通过 Back 键取消掉的,这时你就一定要在代码中做好控制,
* 当数据加载完成后必须要调用 ProgressDialog 的dismiss()方法来关闭对话框,
* 否则 ProgressDialog 将会一直存在。
*/
UI常见四种基本布局
布局是一种可用于放置很多控件的容器,它可以按照一定的规律调整内部控件的位置,从而编写出精美的界面。当然,布局的内部除了放置控件外,也可以放置布局,通过多层布局的嵌套,就能够完成一些比较复杂的界面实现,
- LinearLayout 又称作线性布局,是一种非常常用的布局。正如它名字所描述的一样,这个布局会将它所包含的控件在线性方向上依次排列。(注意:如LinearLayout 的排列方向是 horizontal,内部的控件就绝对不能将宽度指定为 match_parent,因为这样的话单独一个控件就会将整个水平方向占满,其他的控件就没有可放置的位置了。同样的道理,如果 LinearLayout 的排列方向是 vertical,内部的控件就不能将高度指定为 match_parent。)
属性:,android:gravity 是用于指定文字在控件中的对齐方式,android:layout_gravity 是用于指定控件在布局中的对齐方 式 。
android:layout_weight。这个属性允许我们使用比例的方式来指定控件的大小,它在手机屏幕的适配性方面可以起到非常重要的作用。 - RelativeLayout 又称作相对布局,也是一种非常常用的布局。它可以通过相对定位的方式让控件出现在布局的任何位置。
属性:android:layout_above 属性可以让一个控件位于另一个控件的上方,需要为这个属性指定相对控件 id 的引用。android:layout_alignLeft 表示让一个控件的左边缘和另一个控件的左边缘对齐,android:layout_alignRight 表示让一个控件的右边缘和另一个控件的右边缘对齐,还有 android:layout_alignTop 和android:layout_alignBottom,道 - FrameLayout 相比于前面两种布局就简单太多了,因此它的应用场景也少了很多。这种布局没有任何的定位方式,所有的控件都会摆放在布局的左上角。
- TableLayout 允许我们使用表格的方式来排列控件。
自定义控件
假设自定义了一个标题控件,我们先编写一个title.xml,如
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/title_bg">
<Button
android:id="@+id/title_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="5dip"
android:background="@drawable/back_bg"
android:text="Back"
android:textColor="#fff" />
<TextView
android:id="@+id/title_text"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_weight="1"
android:gravity="center"
android:text="Title Text"
android:textColor="#fff"
android:textSize="24sp" />
<Button
android:id="@+id/title_edit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="5dip"
android:background="@drawable/edit_bg"
android:text="Edit"
android:textColor="#fff" />
</LinearLayout>
然后再main.xml中加入以下代码
<include layout="@layout/title" />
引入布局的技巧确实解决了重复编写布局代码的问题,但是如果布局中有一些控件要求能够响应事件,我们还是需要在每个活动中为这些控件单独编写一次事件注册的代码。比如说标题栏中的返回按钮,新建TitleLayout的类,在这个类中写好相应的处理逻辑,然后在main.xml中引入控件,但需要注意的是需要指明控件的完整类名,包名在这里是不可以省略的。
最常用和最难用的控件——ListView
ListView 允许用户通过手指上下滑动的方式将屏幕外的数据滚动到屏幕内,同时屏幕上原有的数据则会滚动出屏幕。
在main.xml中引入ListView与其他控件并无不同。
但在MainActivity中代码如下所示
public class MainActivity extends Activity {
private String[] data = { "Apple", "Banana", "Orange", "Watermelon",
"Pear", "Grape", "Pineapple", "Strawberry", "Cherry", "Mango" };
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ArrayAdapter<String> adapter=new ArrayAdapter<String>(MainActivity.this,
android.R.layout.simple_list_item_1,data);
ListView listView=(ListView) findViewById(R.id.list_view);
listView.setAdapter(adapter);
}
}
定制ListView的界面:这里用到了适配器模式。![运行结果]
还有ListView的点击事件也可了解一下。
单位和尺寸
在布局文件中指定宽高的固定大小有以下常用单位可供选择:px、pt、dp 和 sp。
- px 是像素的意思,即屏幕中可以显示的最小元素单元
- pt 是磅数的意思,1 磅等于 1/72 英寸,一般 pt 都会作为字体的单位来使用。
- dp 是密度无关像素的意思,也被称作 dip,和 px 相比,它在不同密度的屏幕中的显示比例将保持一致。
- sp 是可伸缩像素的意思,它采用了和 dp 同样的设计理念,解决了文字大小的适配问题。
什么叫密度?Android 中的密度就是屏幕每英寸所包含的像素数,通常以 dpi 为单位。