alertdialog setview能在异步任务中实现吗

使用Dialog AlertDialog ----模态异步
编辑:www.fx114.net
本篇文章主要介绍了"使用Dialog AlertDialog ----模态异步",主要涉及到使用Dialog AlertDialog ----模态异步方面的内容,对于使用Dialog AlertDialog ----模态异步感兴趣的同学可以参考一下。
原网址:http://blog.csdn.net/comkingfly/article/details/6578708
Dialog对话框,大家肯定都不陌生。我们使用Windows操作系统、IE浏览器等经常会弹出对话框,这些对话框大部分都是模态的同步对话框。所谓的模态是指:当前弹出的Dialog挡住了它的父窗口,在Dialog消失前,父窗口无法获取焦点,浏览器中的alert对话框就是这样的;所谓的同步是指:程序执行到弹出Dialog后就停在当前行代码,等到Dialog处理完后程序才接着往下执行。
在Android中Dialog是模态异步的,所谓异步Dialog就像是:你在跟一个人交谈,但是你的大脑在想其他东西。android弹出Dialog与用户交互时后台执行线程还是接着执行。同时android中dialog还是managed的,所谓managed是指系统帮你维护dialog,它们可以创建一次后被多次调用,这样就可以不必每次需要dialog都重新创建一个,节省了内存且提供系统的性能。
Dialog通常是挡在activity前的一个小窗体,activity失去焦点,由dialog与用户进行交互,然后根据用户的选择或者输入程序再决定如何运行分支。在Android中有下面几种Dialog:
AlertDialog:一个可以拥有0、1、2或3个按钮的对话框,它里面的内容可以是文本、checkbox或radio的ListView,它是一个经常被用到的Dialog。
ProgressDialog:一个窗体内部是Progress bar的Dialog,它继承了AlertDialog,所以它拥有的按钮跟AlertDialog一样。
DatePickerDialog:一个提供选择日期功能的Dialog。
TimePickerDialog:一个提供选择时间功能的Dialog。
也可以创建自定义的Dialog,自己定义它的布局。下面我们来看看各种dialog的使用方法。首先先从最简单的Alert Dialog了解。
AlertDialog主要用来提示一些文本信息,它跟Javascript中的alert方法不一样。Javascript中alert是模态同步窗体,而android中的AlertDialog则是模态异步窗体。我们使用AlertDialog.Builder来创建AlertDialog对象,你可以使用这个Builder来完成下面几种任务:
1. 显示提示信息,让用户选择是或否。
2. 从Dialog中提供的ListView里选择一个Item
3.从Dialog中提供的ListView里选择多个Item
4. 显示一个进度条
5. 从几个选项中选择一个
创建AlertDialog的步骤分为几步:
1. 创建一个Builder对象
2. 设置要创建的Dialog的参数,如几个按钮,显示什么内容等。
3. 对按钮设置回调函数(因为android中的dialog都是异步的,所以要回调函数)
4. 根据上面几步的设置,让Builder生成dialog对象
5. 使用show()方法将dialog显示出来。
创建一个Activity和一个布局xml文件:
dialog.xml:
view plaincopyprint?
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&&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:text=&显示dialog&
android:onClick=&onShowDialogClick&
&/LinearLayout&
DialogActivity.java
view plaincopyprint?
com.king.dialog
import android.app.A
import android.app.AlertD
import android.content.DialogI
import android.os.B
import android.view.V
import com.android777.demo.uicontroller.R;
DemoDialog extends Activity {
onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog);
onShowDialogClick(View v){
AlertDialog.Builder builder =
new AlertDialog.Builder(this);
builder.setTitle(&测试AlertDialog&);
builder.setPositiveButton(&OK&,
EmptyListener());
AlertDialog ad = builder.create();
ad.show();
//空的监听类
EmptyListener implements DialogInterface.OnClickListener{
onClick(DialogInterface dialog, int
上面是一个很简单的Dialog,接下来我们看看稍微复杂点的Dialog看看它能提供哪些功能?
view plaincopyprint?
onShowDialogClick(View v){
AlertDialog.Builder builder =
new AlertDialog.Builder(this);
EmptyListener l =
new EmptyListener();
//设置Dialog的标题
builder.setTitle(&测试AlertDialog&);
//设置Dialog的icon
builder.setIcon(R.drawable.icon);
//设置Dialog的提示信息
builder.setMessage(&这个是一个提示信息,请选择是或否&);
builder.setPositiveButton(&是&,
builder.setNegativeButton(&否&,
AlertDialog ad = builder.create();
ad.show();
也可以在Dialog中存放单选或者多选的ListView,首先先定义要显示的items,我们把它放在资源文件res/values/arrays.xml里:
res/values/arrays.xml:
view plaincopyprint?
version=&1.0&
encoding=&utf-8&?&
&resources&
&string-array
name=&select_days&&
&item&星期一&/item&
&item&星期二&/item&
&item&星期三&/item&
&item&星期四&/item&
&item&星期五&/item&
&item&星期六&/item&
&item&星期天&/item&
&/string-array&
&/resources&
view plaincopyprint?
onShowDialogClick(View v){
AlertDialog.Builder builder =
new AlertDialog.Builder(this);
EmptyListener l =
new EmptyListener();
//设置Dialog的标题
builder.setTitle(&测试AlertDialog&);
//设置可供选择的ListView
builder.setItems(R.array.select_days,
new DialogInterface.OnClickListener() {
onClick(DialogInterface dialog, int
//which是选中的位置(基于0的)
String[] items = getResources().getStringArray(R.array.select_days);
Toast.makeText(DemoDialog.this,
items[which], Toast.LENGTH_LONG).show();
AlertDialog ad = builder.create();
ad.show();
设置单选只需要将setItems方法改为:setSingleChoiceItems,同时多一个参数checkItem表示默认选中第几个选项即可。不过这边跟setItems不一样的是,setItems时当用户选中某个Item时会触发回调函数同时关闭窗口,而setSingleChoiceItems当用户选中某个Item时会触发回调函数,但是不会关闭窗口,用户需要通过设置3个按钮中任意一个来关闭窗口。
view plaincopyprint?
onShowDialogClick(View v){
AlertDialog.Builder builder =
new AlertDialog.Builder(this);
EmptyListener l =
new EmptyListener();
//设置Dialog的标题
builder.setTitle(&测试AlertDialog&);
//设置可供选择的ListView
builder.setSingleChoiceItems(R.array.select_days,0,
new DialogInterface.OnClickListener() {
onClick(DialogInterface dialog, int
//which是选中的位置(基于0的)
String[] items = getResources().getStringArray(R.array.select_days);
Toast.makeText(DemoDialog.this,
items[which], Toast.LENGTH_LONG).show();
builder.setPositiveButton(&确定&,
AlertDialog ad = builder.create();
ad.show();
上图可以看到当点击ListView中的Items时,回调方法有执行,但是窗体没有自动关闭。
设置多选框跟单选框差不多,它调用方法:setMultiChoiceItems。但是参数有个地方不一样,因为单选的情况下只有一个Item被选中所以可以用一个以0开始的数字来表示选中第几个,但是多选有可能选中多个所以用一个boolean数组来存放各个Item的状态,选中为true,否则为false。
日期选择对话框:
view plaincopyprint?
c = Calendar.getInstance();
DatePickerDialog ad =
new DatePickerDialog(this,
OnDateSetListener() {
onDateSet(DatePicker view, int
monthOfYear, int
dayOfMonth) {
TODO Auto-generated method stub
String date = String.valueOf(year) +
+ String.valueOf(monthOfYear + 1) +
+ String.valueOf(dayOfMonth);
}, c.get(Calendar.YEAR),
c.get(Calendar.MONTH),
.get(Calendar.DATE));
ad.show();
时间选择对话框:
view plaincopyprint?
TimePickerDialog
TimePickerDialog(this,
OnTimeSetListener() {
onTimeSet(TimePicker view, int
hourOfDay,
TODO Auto-generated method stub
String timer =“”;
(hourOfDay & 10) {
&0& + String.valueOf(hourOfDay) +
+ String.valueOf(minute);
(minute & 10) {
timer = String.valueOf(hourOfDay) +
+ String.valueOf(minute);
(hourOfDay & 10 && minute & 10) {
&0& + String.valueOf(hourOfDay) +
+ String.valueOf(minute);
timer = String.valueOf(hourOfDay) +
+ String.valueOf(minute);
}, c.get(Calendar.HOUR_OF_DAY),
c.get(Calendar.MINUTE),
ad.show();
待输入框的对话框:
view plaincopyprint?
EditText(ActivityNoteBooks.this);
//弹出对话框的时候里面带有文字
edt.setText(text);
AlertDialog ad =
new AlertDialog.Builder(this).setTitle(
R.string.wishnametitle).setView(edt).setPositiveButton(
R.string.ok,
OnClickListener() {
onClick(DialogInterface dialog, int
TODO Auto-generated method stub
String s = edt.getText().toString();
}).setNegativeButton(R.string.cancle,
null).create();
ad.show();
一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!
二、互相尊重,对自己的言论和行为负责。
本文标题:
本页链接:先来看看效果这就是一个自定义的dialog。
直接上代码:
漂亮的对话框
sweet-alert-dialog
项目地址: https://github.com/pedant/sweet-alert-dialog
android原生的dialog太生硬...
Android常用实例—Alert Dialog的使用
AlertDialog的使用很普遍,在应用中当你想要用户做出“是”或“否”或者其它各式各样的选择时,为了保持在同样的Activity和不改变...
Android入门第九篇之AlertDialog
对话框介绍与示例
对话框在程序中不是必备的,但是用好对话框能对我们编写的应用增色不少。采用对话框可以大大增加应用的友好性。比较常用的背景是:用户登陆、网络正在下载、下载成功或者失...
转自:http://www.2cto.com/kf/876.html
参考文章:http://www.cnblogs.com/jiezzy/archive//...
弹框在很多使用都使用到了,比如用户的提示,加载网络信息,弹出对话框,接下来去详细了解对话框。
首先了解AlertDialog的基本用法。
android.support.v7.app.Al...
转载请注明出处:http://blog.csdn.net/u/article/details/
AlertDialog简单介绍:
android.support.v7.app.AlertDialog 自定义标题、内容、按钮控件的大小与字体颜色
它一般是用来提醒用户进行确认等操作的。如用户要删除一个信息,就需要提醒用户是否确定要删除。因此它叫“提醒对话框”。内部使用的是建造者模式。
AlertDialog
他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)android异步任务详解 AsynTask
android提供了一套专门用于异步处理的类。即:AynsTask类。使用这个类可以为耗时程序开辟一个新线程进行处理,处理完时返回。
其实,AsynTask类就是对Thread类的一个封装,并且加入了一些新的方法。时,两者都可以实现同样的功能。本文后面将对AsynTask和Thread进行比较。
1、AsynTask类结构
asysTask类主要用到的几个内部回调函数有:
doInBackGround()
onPreExecute()
onPostExecute()
onProgressUpdate()
正是这几个回调函数构成了AsynTask类的使用逻辑结构。
注意:每个AsynTask子类必须至少复写doInBackGround()方法。
2、回调逻辑关系
调用关系如下图:
1&主线程调用AsynTask子类实例的execute()方法后,首先会调用onPreExecute()方法。onPreExecute()在主线程中运行,可以用来写一些开始提示代码。
2&之后启动新线程,调用doInBackground()方法,进行异步数据处理。
3&处理完毕之后异步线程结束,在主线程中调用onPostExecute()方法。onPostExecute()可以进行一些结束提示处理。
补充:在doInBackground()方法异步处理的时候,如果希望通知主线程一些数据(如:处理进度)。这时,可以调用publishProgress()方法。这时,主线程会调用AsynTask子类的onProgressUpdate()方法进行处理。
3、各个函数间数据的传递
通过上面的调用关系,我们就可以大概看出一些数据传递关系。如下:
  execute()向doInBackground()传递。
  doInBackground()的返回值会传递给onPostExecute()。
  publishProgress()向progressUpdate()传递。
要点:为了调用关系明确及安全,AsynTask类在继承时要传入3个泛型。第一个泛型对应execute()向doInBackground()的传递类型。第二个泛型对应doInBackground()的返回类型和传递给onPostExecute()的类型。第三个泛型对应publishProgress()向progressUpdate()传递的类型。
传递的数据都是对应类型的数组,数组都是可变长的哦。可以根据具体情况使用。
看了上面的内容,应该对asynTask类的使用逻辑有了了解。下面写一个简单的例子。
例子功能很简单:activity中有1个textView和botton。当点击botton时,异步改变textView的值,并且在相应的回调函数执行时,用System.out.println()输出值。
&?xml version=&1.0& encoding=&utf-8&?&
&LinearLayout xmlns:android=&&
&&& android:layout_width=&fill_parent&
&&& android:layout_height=&fill_parent&
&&& android:orientation=&vertical& &
&&& &TextView
&&&&&&& android:id=&@+id/text&
&&&&&&& android:layout_width=&fill_parent&
&&&&&&& android:layout_height=&wrap_content&
&&&&&&& android:text=&@string/hello& /&
&&& &Button
&&&&&&& android:id=&@+id/button&
&&&&&&& android:layout_width=&fill_parent&
&&&&&&& android:layout_height=&wrap_content&
&&&&&&& android:text=&change&
&&&&&&& /&
&/LinearLayout&
java代码:
import android.app.A
import android.os.AsyncT
import android.os.B
import android.view.V
import android.view.View.OnClickL
import android.widget.B
import android.widget.TextV
public class AnsyTestActivity extends Activity {
&&& /** Called when the activity is first created. */
&&& TextView text =
&&& Button button=
&&& String str=
&&& AnsyTry anys=
&&& double result=0;
&&& @Override
&&& public void onCreate(Bundle savedInstanceState) {
&&&&&&& super.onCreate(savedInstanceState);
&&&&&&& setContentView(R.layout.main);
&&&&&&& text=(TextView) findViewById(R.id.text);
&&&&&&& button=(Button) findViewById(R.id.button);
&&&&&&& str=&wei&;
&&&&&&& button.setOnClickListener(new OnClickListener() {
&&&&&&&&&&&
&&&&&&&&&&& @Override
&&&&&&&&&&& public void onClick(View v) {
&&&&&&&&&&&&&&& // TODO Auto-generated method stub
&&&&&&&&&&&&&&& anys=new AnsyTry(text);
&&&&&&&&&&&&&&& anys.execute(str);
&&&&&&&&&&&&&&&
&&&&&&&&&&& }
&&&&&&& });
&&& class AnsyTry extends AsyncTask&String, TextView, Double&{
&&&&&&& TextView te=
&&&&&&& public AnsyTry(TextView te) {
&&&&&&&&&&& super();
&&&&&&&&&&& this.te =
&&&&&&& @Override
&&&&&&& protected Double doInBackground(String... params) {
&&&&&&&&&&& // TODO Auto-generated method stub
&&&&&&&&&&& double dou=0;
&&&&&&&&&&& if(params[0].equals(&wei&)){
&&&&&&&&&&&&&&& System.out.println(Thread.currentThread().getName()+&& recive wei&);
&&&&&&&&&&&&&&& dou=100;
&&&&&&&&&&& }
&&&&&&&&&&& publishProgress(te);
&&&&&&&&&&&
&&&&&&& @Override
&&&&&&& protected void onPostExecute(Double result) {
&&&&&&&&&&& // TODO Auto-generated method stub
&&&&&&&&&&& super.onPostExecute(result);
&&&&&&&&&&& System.out.println(&postExecute---double---&+result);
&&&&&&& @Override
&&&&&&& protected void onPreExecute() {
&&&&&&&&&&& // TODO Auto-generated method stub\
&&&&&&&&&&& System.out.println(&pretExecute------&);
&&&&&&&&&&& super.onPreExecute();
&&&&&&& @Override
&&&&&&& protected void onProgressUpdate(TextView... values) {
&&&&&&&&&&& // TODO Auto-generated method stub
&&&&&&&&&&& values[0].setText(values[0].getText()+&1&);
&&&&&&&&&&& super.onProgressUpdate(values);
初次看到这个异步调用关系可能觉得很复杂,但其实熟悉了之后会发现这种结构很好用。这种结构将所有的线程通信都封装成回调函数,调用逻辑容易书写。尤其是在异步处理结束之后,有回调函数进行收尾处理。如果是使用Thread的run()方法,run()结束之后没有返回值。所以必须要自己建立通信机制。但是,其实使用Handler+Thread机制其实完全可以替代AsynTask的这种调用机制。只要将Handler对象传给Thread,就可以进行方便的异步处理。且这种MVC模式结构更加明显,方便管理。所以我觉得,使用asynTask还是Handler+Thread结构,个人喜好吧。但是有一点可以明显能感觉到得是,Handler+Thread适合进行大框架的异步处理,而asynTask适用于小型简单的异步处理。以上都是个人观点+理解。有新观点请指出。
&摘自&&&杨瓦瓦&android AlertDialog 线程问题_百度知道
android AlertDialog 线程问题
在某个void过程中调用send_a_msgbox();发现运行完成后并没有直接跳出一个对话框。感觉是线程相关问题,然后听说在Oncreate中调用,self只需要传Mainactivity.this就可以了。但是如果是其他地方调用呢?
我有更好的答案
AlertDialog.Builder()传的参数是Context,在任何地方调用传当前Activity的实例都可以,最好是传ApplicationContext以防内存泄漏你的Dialog显示不出来有可能是在线程内部调了显示对话框的方法,这样肯定显示不出来的,所有UI操作都应该在主线程中执行,要想子线程执行过程中显示对话框应该使用handler传递消息,在handler里去调用显示对话框的方法
我并没有使用thread这种东西。但是send_a_msgbox()是在一个button的OnClickListener中调用的,不知道有没有问题。另外如果要用handler,该怎么用呢?
没有用Thread就没必要用handler,在监听里写完全可以,可以简单的认为thread外部都是主线程,在主线程显示Dialog都没有问题Handler可以用handler.post(runnable)和handler.sendmessage(message)这两个方法去通知主线程执行UI操作
问题就是调用完send_a_msgbox(),明明里面已经.show()了,但还是没有跳出对话框。而且把builder里面的context中,this换成getApplicationContext()就停止运行了。这又是怎么回事?
抱歉,我说错了,dialog的context只能传activity context,因为它要绑定到activity的window上至于你的dialog显示不出来的问题,我跑了一下你的代码,没有问题,所以找找看其他地方吧
代码我百度私信给你了可能不是对话框的问题按照注释中的东西来,而不是在send_a_msgbox()后进行改变,那是可行的,然而如果按照上面的代码来,那么就会出现奇怪的情况
...新建一个工程代码拷进去看看吧,代码应该是没问题
采纳率:74%
为您推荐:
其他类似问题
您可能关注的内容
alertdialog的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。}

我要回帖

更多关于 alertdialog 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信