1. 对话框大纲
进度条类型:一般、单选、自定义、时间、日期、数据加载loading、数据水平进度条
代码实现:
/**
* 显示一般AlertDialog
* @param v
*/
public void showAD(View v) {
//new AlertDialog.Builder(this).create().show();
new AlertDialog.Builder(this)
.setTitle("删除数据")//设置标题
.setMessage("你确定删除数据吗")
.setPositiveButton("删除", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(DialogActivity.this, "删除数据", 0).show();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(DialogActivity.this, "取消删除数据", 0).show();
}
})
.show(); //方法链调用
}
/**
* 显示单选列表AlertDialog
* @param v
*/
public void showLD(View v) {
final String[] items = {"红", "蓝", "绿", "灰"}; //final的变量在方法执行完后还存在
new AlertDialog.Builder(this)
.setTitle("指定背景颜色")
.setSingleChoiceItems(items, 2, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {//which就是选中的position
//提示颜色
Toast.makeText(DialogActivity.this, items[which], 0).show();
//移除dilaog
dialog.dismiss();
}
})
.show();
}
/**
* 显示自定义AlertDialog
* @param v
*/
public void showCD(View v) {
//动态加载布局文件, 得到对应的View对象
View view = View.inflate(this, R.layout.dialog_view, null);
//问题1: view的真实类型?是布局文件根标签的类型, 包含了子View对象
//问题2: 如何得到一个独立View的子View? view.findViewById(id)
//findViewById(id)是在setContentView()中的View中找
final EditText nameET = (EditText) view.findViewById(R.id.et_dialog_name);
final EditText pwdET = (EditText) view.findViewById(R.id.et_dialog_pwd);
new AlertDialog.Builder(this)
.setView(view)
.setNegativeButton("取消", null)
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//读取用户名和密码
String username = nameET.getText().toString();
String pwd = pwdET.getText().toString();
//提示
Toast.makeText(DialogActivity.this, username+" : "+pwd, 0).show();
}
})
.show();
}
/**
* 显示圆形进度ProgressDialog
* @param v
* @throws InterruptedException
*/
public void showPD(View v){//回调方法: 主线程执行
final ProgressDialog dialog = ProgressDialog.show(this, "数据加载", "数据加载中...");
//模拟做一个长时间的工作
//长时间的工作不能在主线程做, 得启动分线程完成
new Thread(){
public void run() {//分线程
for(int i=0;i<20;i++) {
//休息一会
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//移除dialog
dialog.dismiss();//方法在分线程执行, 但内部使用Handler实现主线程移除dialog
//不能在分线程直接更新UI
//显示toast
//Toast.makeText(DialogActivity.this, "加载完成了!!!", 0).show();
runOnUiThread(new Runnable() {
@Override
public void run() {//在主线程执行
Toast.makeText(DialogActivity.this, "加载完成了!!!", 0).show();
}
});
//runOnUiThread()在分线程执行
}
}.start();
}
/**
* 显示水平进度ProgressDialog
* @param v
*/
public void showPD2(View v) {
//1. 创建dialog对象
final ProgressDialog pd = new ProgressDialog(this);
//2. 设置样式
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
//3. 显示
pd.show();
//4. 启动分线程, 加载数据, 并显示进度, 当加载完成移除dilaog
new Thread(new Runnable() {
@Override
public void run() {
int count = 20;
//设置最大进度
pd.setMax(count);
for(int i=0;i<count;i++) {
//休息一会
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
pd.setProgress(pd.getProgress()+1);
}
//移除dialog
pd.dismiss();
}
}).start();
}
public void showDateAD(View v) {
//创建日历对象
Calendar calendar = Calendar.getInstance();
//得到当前的年月日
int year = calendar.get(Calendar.YEAR);//得到年份
int monthOfYear = calendar.get(Calendar.MONTH);//月
int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);//得到日
Log.e("TAG", year+"-"+monthOfYear+"-"+dayOfMonth);
new DatePickerDialog(this, new OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
Log.e("TAG", year+"--"+(monthOfYear+1)+"--"+dayOfMonth);
}
}, year, monthOfYear, dayOfMonth).show();
}
public void showTimeAD(View v) {
Calendar c = Calendar.getInstance();
int hourOfDay = c.get(Calendar.HOUR_OF_DAY); //得到小时
int minute = c.get(Calendar.MINUTE); //得到分钟
Log.e("TAG", hourOfDay+":"+minute);
new TimePickerDialog(this, new OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
Log.e("TAG", hourOfDay+"::"+minute);
}
}, hourOfDay, minute, true).show();
}
上面是 Android 4.0之前的对话框架
android.support.v7.app.AlertDialog 下diglog样式
普通基础对话框:
日期选择器:
2. Android布局使用
2.1. LinearLayout功能使用
android:layout_weight="1"
1.1. 权重功能:把宽度或者高度 平方成几个等份
1.2. 把水平、垂直其他地方已经wrap_context,然后设置唯一控件匹配所有其他内容
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="20dp"
android:orientation="horizontal">
<!-- 左侧包裹内容 wrap_content-->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#bfc"
android:text="左边包裹内容"></TextView>
<!-- 其他空间中间填充 -->
<!--
android:layout_height="match_parent"
android:layout_weight="1"-->
<View
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="#f00"></View>
<!-- 右侧包裹内容 wrap_content-->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#bfa"
android:text="右侧包裹内容"></TextView>
</LinearLayout>
3.RelativeLayout 布局:
现对于 父视图
layout_alignParentBottom
layout_alignParentTop
layout_alignParentLeft
layout_alignParentRight
居中对齐
android:layout_centerInParent="true"
现对于 兄弟视图
同方向对齐属性:
layout_alignTop
layout_alignBottom
layout_alignLeft
layout_alignRight
反方向对齐:
layout_toRightOf
layout_toLeftOf
layout_below
layout_above
4. FrameLayout
android:gravity: 用于控制孩子内容居中
layout_gravity: 设置自己相对于父元素居中
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="中间"/>
</FrameLayout>
5. 内边距、外边距,安卓控件和div控件一样
内容区域
android:padding : 内边距
android:layout_margin: 外边距
6. Android 样式 和主题
styles.xml
定义,多个样式的集合
<style name="mystyle">
<item name="android:background">#f00</item>
</style>
在布局文件的控件引用:
style="@style/mystyle"
主题: AndroidManifest.xml 在 Activity使用,针对的是Activity
给Activity设置主题:
<activity android:name=".MainActivity"
android:theme="@style/Theme.AppCompat.Light.NoActionBar">
比如设置Activity设置对话框主题,设置全屏主题