【Android】第三章 用户界面(上)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nupotian/article/details/73635416

第0节 如何排查解决常见异常

运行程序时出现


基本常见异常的一般分析步骤:

1. 确定异常类型: 在logcat从下向上找, 最好能找到cause by(会显示那种异常)

2. 找到出现异常的类确定出异常的行号: 找到当前应用的代码行号, 双击定位

3. 分析, 打印Log, debug调试

常见的异常:

1. NullPointerException

原因: 调用值为null的对象的方法或属性

2. ClassCastException

原因: 执行强制转换, 但类型匹配

3. ActivityNotFoundException:

原因: Activity没有找到, 很可能没有注册或注册不正确

第一节 理论概述_UI理解

UI的定义

全称user interface, 意为: 用户界面

UI由View和ViewGroup组成       

View类是所有视图(包括ViewGroup)的根基类

View在屏幕上占据一片矩形区域, 并会在上面进行内容绘制

ViewGroup包含一些View或ViewGroup,用于控制子View的布局

VIEW的API结构

标红色是最重要的,标蓝色的是次要的


UI的组成

界面的整体布局(layout)


组成可视界面的各个UI组件



第二节 理论概述_UI事件

当用户通过手指触摸UI时, 系统会自动创建对应的Event对象

Android中提供了多种方式拦截处理不同类型的事件

视图本身就可以处理发生在该视图上的事件


使用UI事件

•     Android提供了很多不同类型的事件监听器接口

View.OnClickListener:  onClick() 
View.OnLongClickListener: onLongClick()
View.OnTouchListener: onTouch() 
View.OnCreateContextMenuListener: onCreateContextMenu()
View.OnFocusChangeListener:  onFocusChange()
View.OnKeyListener:  onKey()
•	给视图添加事件监听的方式
       view.seton…Listener(listener)

第三节 常用UI组件_测试准备

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <Button
        android:id="@+id/btn_main_test1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="测试常用简单的Component" />
    <Button
        android:id="@+id/btn_main_test2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="测试菜单Component" />
    <Button
        android:id="@+id/btn_main_test3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="测试进度条Component" />
    <Button
        android:id="@+id/btn_main_test4"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="测试对话框Component" />
</LinearLayout>
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);       findViewById(R.id.btn_main_test1).setOnClickListener(this);
    }
	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.btn_main_test1://常用简单的Component
			startActivity(new Intent(this, SimpleComponentActivity.class));
		default:
			break;
		}
	}
第四节 常用UI组件_TextView
TextView :  文本视图
<TextView
    android:id=“@+id/tv_test1_message“     //指定id
    android:layout_width=“match_parent“  //宽度
    android:layout_height=“wrap_content“ //高度
    android:text=“这是TextView的内容“     // 文本
    android:textColor=“#ff0000“    // 文本颜色
    android:textSize=“20sp” />      // 字体大小
第五节 常用UI组件_EditText
<EditText
        android:id="@+id/et_test1_number"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint=“请输入手机号“      //默认提示文本
        android:inputType=“phone”>    // 输入数据类型限定
</EditText>
第六节 常用UI组件_Button
<Button
    android:id="@+id/btn_test1_submit"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
android:text="提 交" />
第七节 常用UI组件_ImageView
<ImageView
    android:id="@+id/iv_test1_play"
    android:layout_width="70dp"
    android:layout_height="70dp"
android:background=“@drawable/ic_launcher“          //背景图片
android:src=“@android:drawable/ic_media_play”/> //前景图片
//设置前景图片
public void setImageResource(int resId)
//设置背景图片
public void setBackgroundResource(int resid)
第八节 08_常用UI组件_CheckBox
<CheckBox
            android:id="@+id/cb_test1_basket"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="篮球" 
            android:checked=“true”/> //标识默认是否勾选
//判断当前是否勾选
boolean isChecked()
//设置CheckBox是否勾选
void setChecked(boolean checked)
//设置选中状态改变的监听
void setOnCheckedChangeListener(OnCheckedChangeListener listener)
第九节 常用UI组件_RadioButton
给RadioGroup设置改变的监听同CheckBox
<RadioGroup      
            android:id="@+id/rg_test1_sex"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >
            <RadioButton
                android:id="@+id/rb_test1_male"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="男" />
            <RadioButton
                android:id="@+id/rb_test1_female"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content“
                android:checked="true"
                android:text="女" />
        </RadioGroup>
具体实例如下
package com.xp.l03_component;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;

public class SimpleComponentActivity extends Activity {
	private TextView tv_simple_message;
	private EditText et_simple_number;
	private Button btn_simple_submit;
	private ImageView iv_simple_icon;
	private CheckBox cb_simple_basket;
	private CheckBox cb_simple_foot;
	private CheckBox cb_simple_pingpang;
	private RadioGroup rg_simple_sex;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_simple_component);
		
		//1. TextView
		tv_simple_message = (TextView) findViewById(R.id.tv_simple_message);
		tv_simple_message.setText("尚硅谷0712NB");
		
		//2. EditText
		et_simple_number = (EditText) findViewById(R.id.et_simple_number);
		
		//3. Button
		btn_simple_submit = (Button) findViewById(R.id.btn_simple_submit);
		btn_simple_submit.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				//得到内容
				String number = et_simple_number.getText().toString();
				//提示
				Toast.makeText(SimpleComponentActivity.this, number, 0).show();
			}
		});
		
		//4. ImageView
		iv_simple_icon = (ImageView) findViewById(R.id.iv_simple_icon);
		iv_simple_icon.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				//设置背景图片
				iv_simple_icon.setBackgroundResource(android.R.drawable.alert_light_frame);
				//设置前景图片
				iv_simple_icon.setImageResource(android.R.drawable.ic_media_pause);
			}
		});
		
		//5. CheckBox
		cb_simple_basket = (CheckBox) findViewById(R.id.cb_simple_basket);
		cb_simple_foot = (CheckBox) findViewById(R.id.cb_simple_foot);
		cb_simple_pingpang = (CheckBox) findViewById(R.id.cb_simple_pingpang);
		//给cb_simple_foot设置选中状态改变的监听
		cb_simple_foot.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
			@Override
			public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
				if(isChecked) {
					Toast.makeText(SimpleComponentActivity.this, "选中了足球", 0).show();
				} else {
					Toast.makeText(SimpleComponentActivity.this, "未选中足球", 0).show();
				}
			}
		});
		
		//6. RadioGroup/RadioButton
		rg_simple_sex = (RadioGroup) findViewById(R.id.rg_simple_sex);
		rg_simple_sex.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
			@Override
			public void onCheckedChanged(RadioGroup group, int checkedId) {//checkedId 选中的radioButton的id
				//找到选中的radioButton
				RadioButton radioButton = (RadioButton) findViewById(checkedId);
				//得到文本
				String sex = radioButton.getText().toString();
				//提示
				Toast.makeText(SimpleComponentActivity.this, sex, 0).show();
			}
		});
	}
	
	public void confirm(View v) {
		StringBuffer sb = new StringBuffer();
		if(cb_simple_basket.isChecked()) {
			sb.append(cb_simple_basket.getText().toString()).append(" ");
		}
		
		if(cb_simple_foot.isChecked()) {
			sb.append(cb_simple_foot.getText().toString()).append(" ");
		}
		
		if(cb_simple_pingpang.isChecked()) {
			sb.append(cb_simple_pingpang.getText().toString());
		}
		
		//提示
		Toast.makeText(this, sb.toString(), 0).show();
	}
}

菜单Component

关于menu的三个问题

如何触发Menu的显示?

如何向Menu中添加MenuItem?

选择某个MenuItem时如何响应?

第十节 10_常用UI组件_OptionMenu

•     OptionMenu在点击手机的menu键触发

•     Activity :onCreateOptionsMenu(Menu menu)

•     显示OptionMenu的回调方法, 在此方法中向Menu中添加MenuItem

•     添加menuItem的两种方式:

•     纯编码方式:   menu.add(….)

•     加载menu文件的方式:

MenuInflater menuInflater = getMenuInflater();
	menuInflater.inflate(R.menu.main_option, menu);
•	 Activity : onOptionsItemSelected(MenuItem item)
•	当选择某个菜单项的回调方法
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <Button
        android:id="@+id/btn_test2_show_cm"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="显示ContextMenu" />
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="1. 点击menu显示选项菜单\n2. 长按按钮显示上下文菜单"
        android:textSize="25dp" />
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/add"
        android:title="添加2">
    </item>
    <item
        android:id="@+id/delete"
        android:title="删除2">
    </item>
</menu>
第十一节 11_常用UI组件_ContextMenu
View : setOnCreateContextMenuListener(listener)
为某个视图添加创建ContextMenu的监听(需要长按触发)
Activity : onCreateContextMenu(menu, view, menuInfo)
显示菜单的回调方法 
Activity : onContextItemSelected(MenuItem item)
当选择某个菜单项的回调方法
package com.xp.l03_component;
import android.app.Activity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

/** 
 * 测试Menu
 */
/*
 * OptionMenu 1. 如何触发Menu的显示? 点击menu键 2. 如何向Menu中添加MenuItem?
 * 重写onCreateOptionMenu() menu.add()或者加载菜单文件 3. 选择某个MenuItem时如何响应?
 * 重写onOptionsItemSelected(), 根据itemId做响应 ContextMenu 1. 如何触发Menu的显示? 长按某个视图
 * view.setOnCreateContextMenuListener(this) 2. 如何向Menu中添加MenuItem?
 * 重写onCreateContextMenu() menu.add() 3. 选择某个MenuItem时如何响应?
 * 重写onContextItemSelected(), 根据itemId做响应
 */
public class MenuActivity extends Activity {
	private Button btn_test2_show_cm;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_menu);
		btn_test2_show_cm = (Button) findViewById(R.id.btn_test2_show_cm);
		// 设置创建上下文菜单的监听
		btn_test2_show_cm.setOnCreateContextMenuListener(this);
	}
	@Override
	public void onCreateContextMenu(ContextMenu menu, View v,
			ContextMenuInfo menuInfo) {
		super.onCreateContextMenu(menu, v, menuInfo);
		// 添加菜单项
		menu.add(0, 1, 0, "添加");
		menu.add(0, 4, 0, "删除");
	}
	@Override
	public boolean onContextItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case 1:
			Toast.makeText(this, "添加", 0).show();
			break;
		case 4:
			Toast.makeText(this, "删除", 0).show();
			break;
		default:
			break;
		}

		return super.onContextItemSelected(item);
	}
	// 用来显示optionmenu的方法: 向menu中添加Item
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {

		// 纯编码方式
		menu.add(0, 2, 0, "添加");
		menu.add(0, 3, 0, "删除");
		return super.onCreateOptionsMenu(menu);
	}
	/*
	 * @Override public boolean onCreateOptionsMenu(Menu menu) {
	 * 
	 * // 菜单文件方式 //1. 得到菜单加载器对象 MenuInflater menuInflater = getMenuInflater();
	 * //2. 加载菜单文件 menuInflater.inflate(R.menu.option_menu, menu); return
	 * super.onCreateOptionsMenu(menu); }
	 */

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {

		switch (item.getItemId()) {
		// case R.id.add:
		case 2:
			Toast.makeText(this, "添加", 0).show();
			break;
		// case R.id.delete:
		case 3:
			Toast.makeText(this, "删除", 0).show();
			break;
		default:
			break;
		}
		return super.onOptionsItemSelected(item);
	}
}
第十二节 12_常用UI组件_进度条准备
进度条Component


<ProgressBar                                                  //默认为圆形进度条

           android:id="@+id/pb_test3_loading1"

           android:layout_width="wrap_content"

            android:layout_height="wrap_content"/>

<ProgressBar

       android:id="@+id/pb_test3_loading2"

       style=“?android:attr/progressBarStyleHorizontal“    //水平进度条

       android:layout_width="match_parent“

       android:layout_height="wrap_content"

        android:progress=“2“     //当前进度, 默认为0

        android:max=“10”/>      // 最大进度, 默认为100

•     ProgressBar

    void setProgress(int Progress) : 设置当前进度

    int getProgress() : 得到当前进度

    void setMax(int max) : 设置最大进度

    int getMax() : 设置或得到最大进度

•     View

    void setVisibility(intvisibility) : 设置视图的可见性

    View. VISIBLE : 标识可见

    View. INVISIBLE : 标识不可见, 但占屏幕空间

    View.GONE : 标识不可见, 也不占屏幕空间

13_常用UI组件_进度条

SeekBar : 可手动滑动的进度条

<SeekBar

       android:id="@+id/sb_test3_prgress"

        android:layout_width="match_parent"

       android:layout_height="wrap_content" />

SeekBar:

        setOnSeekBarChangeListener(OnSeekBarChangeListener l)  : 设置改变的监听

OnSeekBarChangeListener:

         onProgressChanged(SeekBar seekBar, intprogress, boolean fromUser) : 进度改变

         onStartTrackingTouch(SeekBar seekBar): 按下滑杆

         onStopTrackingTouch(SeekBar seekBar) :从滑杆离开

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="fill_parent"

    android:orientation="vertical">

    <LinearLayout

       android:id="@+id/ll_progress_loading"

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:gravity="center">

       <ProgressBar

            android:layout_width="wrap_content"

           android:layout_height="wrap_content"/>

       <TextView

           android:layout_width="wrap_content"

           android:layout_height="wrap_content"

           android:text="正在加载中..."/>

    </LinearLayout>

    <ProgressBar

       android:id="@+id/pb_progress_loading"

       style="?android:attr/progressBarStyleHorizontal"

       android:layout_width="fill_parent"

       android:layout_height="wrap_content"

       android:progress="30"/>

    <SeekBar

       android:id="@+id/sb_progress_loading"

       android:layout_width="match_parent"

       android:layout_height="wrap_content"/>

    <TextView

       android:layout_width="fill_parent"

       android:layout_height="wrap_content"

        android:text="1.滑动下面的滑杆后,上面的进度条会同步\n2.滑动到最大值时, 最上面的进度条消失"/>

</LinearLayout>

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
/**
 * 测试进度条
 */
public class ProgressActivity extends Activity {
	private LinearLayout ll_progress_loading;
	private ProgressBar pb_progress_loading;
	private SeekBar sb_progress_loading;
	private OnSeekBarChangeListener onSeekBarChangeListener = new OnSeekBarChangeListener() {
		@Override
		public void onStopTrackingTouch(SeekBar seekBar) {//离开滑杆
			Log.e("TAG", "离开滑杆");
			//1. 得到seekBar的进度
			int progress = sb_progress_loading.getProgress();
			//2. 设置为ProgressBar的进度
			pb_progress_loading.setProgress(progress);
			
			//3. 判断是否达到最大值
			if(progress==sb_progress_loading.getMax()) {
				//如果达到了, 设置ll_progress_loading不可见
				//ll_progress_loading.setVisibility(View.INVISIBLE); //不可见, 但占用空间
				ll_progress_loading.setVisibility(View.GONE);////不可见, 且不占用空间
			} else {
				//如果没有达到 设置ll_progress_loading显示
				ll_progress_loading.setVisibility(View.VISIBLE);
			}
		}
		@Override
		public void onStartTrackingTouch(SeekBar seekBar) {//按下滑杆
			Log.e("TAG", "按下滑杆");
		}
		@Override
		public void onProgressChanged(SeekBar seekBar, int progress,
				boolean fromUser) {//滑杆移动
			Log.e("TAG", "滑杆移动");
		}
	};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_progress);
		ll_progress_loading = (LinearLayout) findViewById(R.id.ll_progress_loading);
		pb_progress_loading = (ProgressBar) findViewById(R.id.pb_progress_loading);
		sb_progress_loading = (SeekBar) findViewById(R.id.sb_progress_loading);
		//给seekbar设置监听
		sb_progress_loading.setOnSeekBarChangeListener(onSeekBarChangeListener );
	}
}

测试AlertDialog

测试ProgressDialog

测试DatePickDialog TimePickDialog


第十五节 15_常用UI组件_带单选列表的AlertDialog

AlertDialog  :

    show()   : 显示警告框

    没有公开的构造方法, 只能通过其内部类Builder来创建

AlertDialog.Builder :  

    create() : 创建AlertDialog对象

    show() : 创建AlertDialog对象, 同时将其显示出来

    setTitle(CharSequence title) : 设置标题

    setMessage(CharSequence message) : 设置内容

    setPositiveButton(String text, OnClickListener listener) : 设置正面按钮

    setNegativeButton(String text, OnClickListener listener): 设置负面按钮

    dismiss() : 移除dialog

    setSingleChoiceItems(….)设置单选项列表


第十六节 16_常用UI组件_自定义布局的AlertDialog

DialogBuilder  :

    setView(View view)  :  设置Dialog中的视图

View :

    View inflate(Context context, int resource, ViewGroup root)  : 动态加载布局得到View


第十七节 17_常用UI组件_圆形进度ProgressDialog

ProgressDialog  :

    static show(Context context, CharSequence title,CharSequencemessage)  : 显示dialog

    

    ProgressDialog(Context context) : 构造方法

    setProgressStyle(int style) 设置样式

    ProgressDialog.STYLE_HORIZONTAL :水平进度条样式


第十八节 18_常用UI组件_水平进度的ProgressDialog

 ProgressDialog.STYLE_HORIZONTAL :水平进度条样式


启动分线程(复习)

方式一:

new Thread(){

      public void run(){

             //下面的代码在分线程执行

      }

}.start();

方式二:

new Thread(new Runnable(){

        public void run(){

             //下面的代码在分线程执行

      }

}).start();

第十九节 19_常用UI组件_日期时间Dialog

public DatePickerDialog(Contextcontext,

       OnDateSetListener callBack,   //点击确定的回调监听

       int year,        //显示年份

        int monthOfYear, // 显示月分

        int dayOfMonth)        // 显示日


TimeDialog : 时间Dialog


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <!-- AlertDialog -->
    <Button
        android:id="@+id/btn_test4_ad"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="showAD"
        android:text="显示一般AlertDialog" />

    <Button
        android:id="@+id/btn_test4_ld"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="showLD"
        android:text="显示单选列表AlertDialog" />

    <Button
        android:id="@+id/btn_test4_custom"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="showCD"
        android:text="显示自定义AlertDialog" />

    
    <!-- ProgressDialog -->
    <Button
        android:id="@+id/btn_test4_pd"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="showPD"
        android:text="显示圆形进度ProgressDialog" 
        android:layout_marginTop="20dp"/>

    <Button
        android:id="@+id/btn_test4_pd2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="showPD2"
        android:text="显示水平进度ProgressDialog" />

    
    
    <!-- DatePickerDialog与TimePickerDialog -->
    <Button
        android:id="@+id/btn_test4_dd"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="showDateAD"
        android:text="显示DatePickerDialog" 
        android:layout_marginTop="20dp"/>

    <Button
        android:id="@+id/btn_test4_td"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="showTimeAD"
        android:text="显示TimePickerDialog" />

</LinearLayout>
public class DialogActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		
		setContentView(R.layout.activity_dialog);
	}
	
	/**
	 * 显示一般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();
	}
}





猜你喜欢

转载自blog.csdn.net/nupotian/article/details/73635416