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 对话框外边距 安卓对话框布局_java


 上面是 Android 4.0之前的对话框架 

android.support.v7.app.AlertDialog 下diglog样式

普通基础对话框:

Android 对话框外边距 安卓对话框布局_android studio_02

 日期选择器:

Android 对话框外边距 安卓对话框布局_Android 对话框外边距_03

  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>

Android 对话框外边距 安卓对话框布局_android_04

    

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设置对话框主题,设置全屏主题