# 界面布局
提示
在 Android 中,不允许线程更新程序界面,需要使用 Handler对象来更新 UI,充当子线程和 UI 主线程的信使
# 标题栏
显示标题栏:
ActionBar actionBar = getActionBar();
actionBar.show();
隐藏标题栏:
ActionBar actionBar = getActionBar();
actionBar.hide();
# 包含 XML 布局
<include layout="@layout/XML名称"></include>
# 按钮 Button
<Button
android:id="@+id/按钮ID"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按钮标题"
/>
绑定按钮事件:
Button Button1 = (Button)findViewById(R.id.按钮ID);
Button1.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
}
});
# 图片按钮 ImageButton
<ImageButton
android:id="@+id/按钮ID"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/图片路径"
android:background="#0000"
/>
提示
可使用 `android:background="#0000"` 将背景设置透明
# 文本框 TextView
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/字符串名称"
/>
\src\res\values\strings.xml
<resource>
<string name="字符串名称">文本框内容</string>
</resource>
TextView 常用属性:
- 字体大小:
`android:` textSize="字体大小(单位 sp)" - 字体颜色:
`android:textColor="#十六进制颜色值"` - 背景:
`android:background="背景图片路径/#十六进制颜色值"` - 设置单行:
`android:singleLine="true"`
# 编辑框 EditText
<EditText
android:id="@+id/编辑框ID"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="提示内容"
/>
TextView 常用属性:
- 编辑框类型:
`android:` inputType="编辑框类型" - 设置编辑框行数:
`android:lines="行数"` - 在上侧显示图标:
`android:` drawableTop="@mipmap\图标路径" - 在下侧显示图标:
`android:` drawableBottom="@mipmap\图标路径" - 在左侧显示图标:
`android:` drawableLeft="@mipmap\图标路径" - 在右侧显示图标:
`android:` drawableRight="@mipmap\图标路径"
# 单选按钮 RadioButton
<RadioGroup
android:layout_width="wrap_content"
android:layout_height="wrap_content"
<RadioButton
android:id="@+id/单选按钮ID"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="单选按钮内容"
android:checked="true"
/>
</RadioGroup>
获取选择状态: `单选按钮.isCgecked()`
# 多选框 CheckBox
<CheckBox
android:id="@+id/多选框ID"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="多选框内容"
android:checked="true"
/>
获取选择状态: `单选按钮.isCgecked()`
# 图片框 ImageView
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/图片名称(无扩展名)"
/>
提示
- 可使用
`android:scaleType`属性设置缩放模式 - 可使用
`android:adjustViewBounds="true"`属性设置取消等比例缩放 - 可使用
`android:maxWidth="100dp"`属性设置最大宽度 - 可使用
`android:maxHeight="100dp"`属性设置最大高度
# 图片切换器 ImageSwitcher
<ImageSwitcher
android:id="@+id/图像切换器ID"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/图片名称(无扩展名)"
/>
private int[] 图片数组 = new int[R.drawable.图片名1,R.drawable.图片名2]
ImageSwitcher 图像切换器 = (ImageSwitcher)findViewById(R.id.图像切换器ID);
//设置淡入动画
图像切换器.setInAnimation (AnimationUtils.loadAnimation(MainActivity.this,android.R.anim.fade_in));
//设置淡出动画
图像切换器.setOutAnimation (AnimationUtils.loadAnimation(MainActivity.this,android.R.anim.fade_out));
图像切换器.setFactory (new ViewSwitcher.ViewFactory() {
@Override
public View makeView() {
ImageView imageView = new ImageView (MainActivity.this);
imageView.setImageResource(图片数组[0]) ;
return imageView;
});
# 日期选择器 DatePicker
<DatePicker
android:id="@+id/日期选择器ID"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
# 时间选择器 TimePicker
<TimePicker
android:id="@+id/时间选择器ID"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
TimePicker TimePicker1= (TimePicker) findViewById(R.id.时间选择器ID);
//设置24小时制
TimePicker1.setIs24HourView(true);
TimePicker1.setOnTimeChangedListener (new TimePicker.OnTimeChangedListener(){
@Override
public void onTimeChanged (TimePicker view,int hour0fDay, int minute) {
String time = hour0fDay+ "时"+minute+"分";
//显示当前选择时间
Toast.makeText(MainActivity.this,time,Toast.LENGTH_SHORT).show();
});
# 计时器 Chronometer
<Chronometer
android:id="@+id/计时器ID"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
Chronometer Chronometer1 = (Chronometer)findViewById(R.id.计时器D);
Chronometer1.setBase(SystemClock.elapsedRealtime());
Chronometer1.setFormat("%s");
Chronometer1.start();
Chronometer1.setOnChronometerTickListener (new Chronometer.OnChronometerTickListener() {
@Override
public void onChr onometer Tick (Chr onometer chr onometer) {
}
}
# 进度条 ProgressBar
<ProgressBar
android:id="@+id/进度条ID"
style="?android:attr/progressBarStyleHorizontal"
android:max="100"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
提示
- 可使用
`style`属性设置进度条样式(默认旋转圆圈) - 可使用
`进度条.setProgress`方法设置当前进度
private int mProgress = 0;
private Handler Handler1;
@0verride
protected void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView(R.layout.activity_main);
progressBar = (ProgressBar)findViewById(进度条ID);
Handler1 = new Handler () {
@Override
public void handleMessage (Message msg) {
if(msg.what == 0x111){
progressBar.setProgress(mProgress);
}else{
Toast.makeText(MainActivity.this,"耗时操作已完成",Toast.LENGTH_SHORT).show();
progressBar.setVisibility (View.GONE);
}
}
};
new Thread (new Runnab1p() {
@0verride
public void run() {
while(true){
mProgress = doWork();
Message m = new Message ();
if (mProgress<100) {
m.what=0x111;
Handler1.sendMessage(m);
}else{
m.what = 0x110;
Handler1.sendMessage(m);
break;
}
}
}
private int doWork(){
mProgress = mProgress + Math.random() * 10;
try{
Thread.sleep(200);
} catch(InterruptedException e){
e.printStackTrace();
}
return mProgress;
}
}).start();
# 拖动条 SeekBar
<SeekBar
android:id="@+id/拖动条ID"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:max="100"
/>
提示
- 可使用
`thumb`属性设置进度条样式 - 可使用
`拖动条.setProgress`方法设置拖动值
# 星级评分条 RatingBar
<RatingBar
android:id="@+id/星级评分条ID"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:numStars="5"
android:rating="3"
android:stepSize="1"
android:isIndicator="false"
/>
提示
- 可使用
`android:numStars`属性设置星级的数量 - 可使用
`android:rating`属性设置默认选择星级的数量 - 可使用
`android:stepSize`属性设置选择步长(默认可选择半颗星) - 可使用
`android:isIndicator="true"`属性设置只读 - 可使用
`星级评分条.getRating()`方法获取当前选择的星级
# 下拉列表
<Spinner
android:id="@+id/下拉列表ID"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:entries="@array/数组名称"
/>
新建\src\res\values\arrays.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="数组名称">
<item>列表项1</item>
<item>列表项2</item>
<item>列表项3</item>
</string-array>
</resources>
通过适配器设置列表项:
Spinner spinner = (ListView)findViewById(下拉列表ID);
String [] 数组名称 = new String[]{"列表项1","列表项2"}
ArrayAdpter<String> adapter = new ArrayAdpter<String>(this.android.R.layout.simple.list_item_1,数组名称)
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
spinner.setAdapter(adapter)
# 列表视图
<ListView
android:id="@+id/列表视图ID"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:entries="@array/数组名称"
/>
新建\src\res\values\arrays.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="数组名称">
<item>列表项1</item>
<item>列表项2</item>
</string-array>
</resources>
通过适配器设置列表项:
ListView listView = (ListView)findViewById(列表视图ID);
String [] 数组名称 = new String[]{"列表项1","列表项2"}
ArrayAdpter<String> adapter = new ArrayAdpter<String>(this.android.R.layout.simple.list_item_1,数组名称)
listView.setAdapter(adapter)
# 滚动视图
提示
滚动视图中只能包含一个组件,一般包含其他布局(如线性布局)
# 垂直滚动
<ScrollView
android:layout_width="math_parent"
android:layout_height="wrap_content">
</ScrollView>
# 水平滚动
<HorizontalScrollView
android:layout_width="wrap_content"
android:layout_height="math_parent">
</ScrollView>
# 选项卡
将自带的布局改为 `TabHost` ,并删除 padding 边距
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost"
android:layout_width="math_parent"
android:layout_height="math_parent">
<TabWidget
android:id="@android:id/tabs"
android:layout_width="math_parent"
android:layout_height="wrap_content">
<TabWidget/>
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="math_parent"
android:layout_height="math_parent">
</FrameLayout>
</TabHost>
TabHost tabHost = (TabHost)findViewById(Android.R.id.tabhost);
tabHost.setip();
LayoutInflater inflater = LayoutInflater.from(this);
inflater.inflate(R.layout.XML页名1,tabHost.getTabContentView());
inflater.inflate(R.layout.XML页名2,tabHost.getTabContentView());
tabHost.addTab(tabHost.newTabSpec("tab1").setIndicator("Tab页面标题1").setContent(R.id.left))
tabHost.addTab(tabHost.newTabSpec("tab2").setIndicator("Tab页面标题2").setContent(R.id.right))