当前位置: 代码迷 >> Android >> Android实战简易课程-第六枪(各种对话框Dialog用法研究大全)
  详细解决方案

Android实战简易课程-第六枪(各种对话框Dialog用法研究大全)

热度:71   发布时间:2016-04-28 00:39:39.0
Android实战简易教程-第六枪(各种对话框Dialog用法研究大全)

在图形界面中,对话框也是人机交互的一种重要形式,程序可以通过对话框进行一些信息的提示,而用户也可以通过对话框和程序进行一些简单的交互操作。

在Android中,所有的对话框都是从android.app.Dialog类继承而来的,此类的继承结构如下:

java.lang.Object

   android.app.Dialog

可以发现此类直接继承自Object类,与View类没有任何继承关系。

一、AlertDialog和AlertDialog.Builder

警告框(AlertDialog)是项目中最常见的对话框形式,是Dialog的直接子类。

如果想要实例化AlertDialog类,往往需要依靠其内部类AlertDialog.Builder类完成。

下面通过一个最常见的返回键提示退出功能来演示一下其用法。

1.布局文件main.xml,我们只要研究返回键,所以布局文件可以不设置任何控件。

2.MainActivity.java:

package org.yayun.demo;import android.app.Activity;import android.app.AlertDialog;import android.app.Dialog;import android.content.DialogInterface;import android.content.DialogInterface.OnClickListener;import android.os.Bundle;import android.view.KeyEvent;import android.view.View.OnKeyListener;public class MainActivity extends Activity {		public void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState); // 生命周期方法		super.setContentView(R.layout.main); // 设置要使用的布局管理器	}	@Override	public boolean onKeyDown(int keyCode, KeyEvent event) {		if(keyCode==KeyEvent.KEYCODE_BACK){			this.exitDialog();		}		return super.onKeyDown(keyCode, event);	}	private void exitDialog() {		Dialog dialog=new AlertDialog.Builder(this).setTitle("程序退出?").setMessage("确定退出吗?").setPositiveButton("退出", new OnClickListener() {						public void onClick(DialogInterface dialog, int which) {				MainActivity.this.finish();							}		}).setNegativeButton("取消", new OnClickListener() {						public void onClick(DialogInterface dialog, int which) {				// TODO Auto-generated method stub							}		}).create();//创建Dialog		dialog.show();//显示对话框			}}


运行实例如下:

这属于比较简单的应用,但是在实际开发中用到比较多。

二、类似ListView的显示风格的选项列表

这种显示风格要用到setSingleChoiceItems()方法;

1.main.xml代码如下:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"	android:orientation="vertical" android:layout_width="fill_parent"	android:layout_height="fill_parent">	<TextView		android:id="@+id/mych"		android:text=""		android:layout_width="wrap_content"		android:layout_height="wrap_content" />	<TextView		android:id="@+id/mytext"		android:text=""		android:layout_width="wrap_content"		android:layout_height="wrap_content" />	<Button 		android:id="@+id/mybut"		android:text="选择水果"		android:layout_width="wrap_content" 		android:layout_height="wrap_content"/></LinearLayout> 


2.MainActivity.java如下:

package org.lxh.demo;import android.app.Activity;import android.app.AlertDialog;import android.app.Dialog;import android.content.DialogInterface;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;public class MyDialogDemo extends Activity {	private Button mybut = null ;	// 定义按钮	private TextView mych = null ;	// 定义文本	private TextView mytext = null ;	// 定义文本	private String fruitData [] = new String[] { "苹果", "西瓜", "水蜜桃" };	private String fruitDesc [] = new String[] {			"苹果,植物类水果,多次花果,具有丰富的营养成分,有食疗、辅助治疗等功能。",			"西瓜(学名:Citrullus Lanatus,英文:Watermelon),属葫芦科,原产于非洲。",			"水蜜桃,在植物分类学上属于蔷薇科,梅属,桃亚属,为落叶小乔木。"} ;	private int chNum = 0 ;	// 保存选项	@Override 	public void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		super.setContentView(R.layout.main); // 调用布局管理器		this.mybut = (Button) super.findViewById(R.id.mybut) ;	// 取得按钮		this.mych = (TextView) super.findViewById(R.id.mych) ;	// 取得文本		this.mytext = (TextView) super.findViewById(R.id.mytext) ;	// 取得文本		this.mybut.setOnClickListener(new OnClickListenerImpl()) ;	// 设置事件类	}	private class OnClickListenerImpl implements OnClickListener { 		@Override		public void onClick(View view) {			Dialog dialog = new AlertDialog.Builder(MyDialogDemo.this)				.setIcon(R.drawable.pic_m) 				.setTitle("请选择你喜欢吃的水果?")				.setPositiveButton("确定", new DialogInterface.OnClickListener() {										@Override					public void onClick(DialogInterface dialog, int which) {									MyDialogDemo.this.mych											.setText(MyDialogDemo.this.fruitData[MyDialogDemo.this.chNum]);	// 设置选项的名称					}				})				.setNegativeButton("取消", new DialogInterface.OnClickListener() {					@Override					public void onClick(DialogInterface dialog, int which) {											}				}).setSingleChoiceItems(MyDialogDemo.this.fruitData, 0, new DialogInterface.OnClickListener() {//setSingleChoiceItems()方法					@Override					public void onClick(DialogInterface dialog, int which) {									MyDialogDemo.this.mytext											.setText(MyDialogDemo.this.fruitDesc[which]);									MyDialogDemo.this.chNum = which ;	// 保存选项的索引					}				}).create() ;			dialog.show() ;		}			}}


运行实例:

三、定制对话框和LayoutInflater

之前的对话框都是直接通过Activity程序进行定义的,但是如果希望在对话框中显示一些复杂的界面,例如编写一个登陆提示对话框,就需要通过布局文件定义显示组件,之后再将这些布局显示包含到对话框中,而如果想要包含,则需要LayoutInflater类的支持。

1定义布局管理器main.xml:

<?xml version="1.0" encoding="utf-8"?><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/mybut"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:text="登录" /></LinearLayout>


2.定义对话框所需的布局管理器login.xml:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical" >   <LinearLayout     android:layout_width="fill_parent"    android:layout_height="wrap_content"    android:orientation="horizontal" >     <TextView                android:layout_width="60dp"        android:layout_height="wrap_content"        android:layout_weight="1"        android:text="用户名:" />      <EditText        android:id="@+id/edit_user"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_weight="88"        android:text="yayun" />        </LinearLayout><LinearLayout     android:layout_width="fill_parent"    android:layout_height="wrap_content"    android:orientation="horizontal" >     <TextView                android:layout_width="60dp"        android:layout_height="wrap_content"        android:layout_weight="1"        android:text="密码:" />      <EditText        android:id="@+id/edit_passwd"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_weight="88"        android:password="true"        android:text="123456" />        </LinearLayout></LinearLayout>


3.定义MainActivity.java:

package org.lxh.demo;import android.app.Activity;import android.app.AlertDialog;import android.app.Dialog;import android.content.DialogInterface;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;public class MyDialogDemo extends Activity {	private Button btn;	String string_userString;	String string_passwdString;			@Override 	public void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		super.setContentView(R.layout.main); // 调用布局管理器		btn=(Button)findViewById(R.id.mybut);		btn.setOnClickListener(new OnClickListenerImpl());			}	private class OnClickListenerImpl implements OnClickListener{		@Override		public void onClick(View v) {			LayoutInflater layoutInflater=LayoutInflater.from(MyDialogDemo.this);//获得layoutInflater对象			View view=layoutInflater.from(MyDialogDemo.this).inflate(R.layout.login, null);//获得view对象			EditText edit_user=(EditText)view.findViewById(R.id.edit_user);//获取控件			EditText edit_passwd=(EditText)view.findViewById(R.id.edit_passwd);			 string_userString=edit_user.getText().toString();			 string_passwdString=edit_passwd.getText().toString();			Dialog dialog=new AlertDialog.Builder(MyDialogDemo.this).setTitle("用户登录").setView(view).setPositiveButton("登录", new DialogInterface.OnClickListener() {								public void onClick(DialogInterface dialog, int which) {					if(string_userString.equals("yayun")&&string_passwdString.equals("123456")){						Toast.makeText(MyDialogDemo.this, "登录成功", Toast.LENGTH_SHORT).show();					}else{						Toast.makeText(MyDialogDemo.this, "登录失败", Toast.LENGTH_SHORT).show();					}									}			}).setNegativeButton("取消", new DialogInterface.OnClickListener() {								@Override				public void onClick(DialogInterface dialog, int which) {					// TODO Auto-generated method stub									}			}).create();			dialog.show();		}							}	}


4.运行实例:

四、日期对话框(DatePickerDialog)和时间对话框(TimePickerDialog)

主要进行日期和时间的设置。

1.main.xml代码如下:

<?xml version="1.0" encoding="utf-8"?><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/mybut"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:text="设置日期" />    <Button        android:id="@+id/mytext"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:text="" /></LinearLayout>


2.MainActivity.java代码如下:

package org.lxh.demo;import android.app.Activity;import android.app.DatePickerDialog;import android.app.Dialog;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.DatePicker;import android.widget.TextView;public class MyDialogDemo extends Activity {	private Button btn;	private TextView textView;			@Override 	public void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		super.setContentView(R.layout.main); // 调用布局管理器		btn=(Button)findViewById(R.id.mybut);		textView=(TextView)findViewById(R.id.mytext);		btn.setOnClickListener(new OnClickListenerImpl());			}	private class OnClickListenerImpl implements OnClickListener{		@Override		public void onClick(View v) {			Dialog dialog=new DatePickerDialog(MyDialogDemo.this, new DatePickerDialog.OnDateSetListener() {								@Override				public void onDateSet(DatePicker view, int year, int monthOfYear,						int dayOfMonth) {					textView.setText("更新日期为:"+year+"年-"+(monthOfYear+1)+"月-"+dayOfMonth+"日");									}			}, 1990, 04, 01);			dialog.show();					}			}		}


运行实例:

TimePickerDialog对话框和DatePickerDialog对话框基本一样。

五、进度条对话框

先看一个简单的圈形进度处理对话框,这个在开发中也十分常见,常用于登录等待、网络连接等待、数据刷新等待等,可以增加用户友好度。

1.main.xml代码如下:

<?xml version="1.0" encoding="utf-8"?><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/mybut"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:text="查找网络" /></LinearLayout>


2.MainActivity.java代码如下:

package org.lxh.demo;import android.app.Activity;import android.app.DatePickerDialog;import android.app.Dialog;import android.app.ProgressDialog;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.DatePicker;import android.widget.TextView;public class MyDialogDemo extends Activity {	private Button btn;	@Override	public void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		super.setContentView(R.layout.main); // 调用布局管理器		btn = (Button) findViewById(R.id.mybut);		btn.setOnClickListener(new OnClickListenerImpl());	}	private class OnClickListenerImpl implements OnClickListener {		@Override		public void onClick(View v) {			final ProgressDialog dialog = ProgressDialog.show(					MyDialogDemo.this, "请搜索网络...", "请耐心等待...");// 之所以用final定义,主要目的是为了让内部类可以访问方法中定义的参数。			new Thread() {				public void run() {					try {						Thread.sleep(3000);					} catch (InterruptedException e) {						// TODO Auto-generated catch block						e.printStackTrace();					} finally {						dialog.dismiss();					}				};			}.start();					}	}}


运行实例:

三秒钟后对话框会自动消失!

在默认情况下,进度对话框采用的是环形进度条(STYLE_SPINNER)的显示风格,用户也可以根据需要将进度条设置为水平(STYLE_HORIZONTAL)显示风格。

1.main.xml代码:

<?xml version="1.0" encoding="utf-8"?><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/mybut"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:text="查找网络" /></LinearLayout>


2.MainActivity.java代码如下:

package org.lxh.demo;import android.app.Activity;import android.app.ProgressDialog;import android.content.DialogInterface;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MyDialogDemo extends Activity {	private Button btn;	private static final int MAX_PROGRESS=100;//总进度值		@Override	public void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		super.setContentView(R.layout.main); // 调用布局管理器		btn = (Button) findViewById(R.id.mybut);		btn.setOnClickListener(new OnClickListenerImpl());	}	private class OnClickListenerImpl implements OnClickListener {		@Override		public void onClick(View v) {			final ProgressDialog dialog=new ProgressDialog(MyDialogDemo.this);			dialog.setTitle("搜索网络...");			dialog.setMessage("正在搜索,请耐心等待...");			dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//显示样式,水平显示			dialog.setMax(MAX_PROGRESS);			dialog.setProgress(30);//初始位置			dialog.setButton("后台处理", new DialogInterface.OnClickListener() {								@Override				public void onClick(DialogInterface dialog, int which) {					dialog.dismiss();									}			});			dialog.setButton2("详细信息", new DialogInterface.OnClickListener() {//注意Button2!!								@Override				public void onClick(DialogInterface dialog, int which) {					// TODO Auto-generated method stub									}			});			dialog.onStart();//启动进度条			dialog.show();			new Thread(){				public void run() {					for (int i = 0; i <MAX_PROGRESS; i++) {						try {							Thread.sleep(500);						} catch (InterruptedException e) {							// TODO Auto-generated catch block							e.printStackTrace();						}						dialog.incrementProgressBy(1);//自增长1,重要!					}					dialog.dismiss();				};			}.start();					}	}}


运行如下:

总结

1.如果想要实例化AlertDialog类,往往需要依靠其内部类AlertDialog.Builder类完成;

2.判断是否是返回键:keyCode==KeyEvent.KEYCODE_BACK;

3.setSingleChoiceItems()方法的使用;

4.LayoutInflater类引入布局文件,LayoutInflater layoutInflater=LayoutInflater.from(MyDialogDemo.this);//获得layoutInflater对象View view=layoutInflater.from(MyDialogDemo.this).inflate(R.layout.login, null);//获得view对象;

5.Dialog 的setView()方法,设置显示布局;

6.日期对话框(DatePickerDialog)和时间对话框(TimePickerDialog);

7.ProgressDialog的setProgressStyle()方法设置等待对话框显示样式,incrementProgressBy()启动自增长。

 

喜欢的朋友可以关注我!谢谢哦

  相关解决方案