文档章节

Android基础 - 对话框和浮动Activity【转】

kevin.gan
 kevin.gan
发布于 2010/01/06 18:00
字数 1555
阅读 1861
收藏 0

在之前的学习过程中我们已经知道,Android应用中最常用的屏幕显示开发是基于Activity的,但是,在很多情况下我们需要显示一个对话框或浮动窗体来完成一些简单的任务,比如需要让用户输入一些内容,或让用户确认一些信息。

在Android中,我们可以通过两种方式来创建对话框:
1. 借助Dialog类,或它的子类(如AlertDialog)
2. 使用Activity的对话框主题

使用Dialog类:
让我们先来看下如何借助Dialog类创建对话框,首先,我们需要定义一个继承了Dialog类的子类:

class MyDialog extends Dialog {
    public MyDialog(Context context) {
        super(context);
    }
}

然后,为这个对话框的内容定义一个布局文件,比如:


            android:id=”@+id/widget28″
     android:layout_width=”fill_parent”
     android:layout_height=”fill_parent”
     android:orientation=”vertical”
     xmlns:android=”http://schemas.android.com/apk/res/android”>
                    android:id=”@+id/nameMessage”
        android:layout_width=”fill_parent”
        android:layout_height=”wrap_content”
        android:text=”Enter Name:”>
                    android:id=”@+id/nameEditText”
        android:layout_width=”fill_parent”
        android:layout_height=”wrap_content”
        android:textSize=”18sp”>
                    android:id=”@+id/buttonLayout”
        android:layout_width=”fill_parent”
        android:layout_height=”wrap_content”
        android:layout_gravity=”center_horizontal”>
                          android:id=”@+id/okButton”
          android:layout_width=”wrap_content”
          android:layout_height=”wrap_content”
          android:text=”OK”>
                         android:id=”@+id/cancelButton”
          android:layout_width=”wrap_content”
          android:layout_height=”wrap_content”
          android:text=”Cancel”>
    

接着,将上面这份布局文件应用到我们的对话框上来:

class MyDialog extends Dialog {
    ….
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(”TestApp”, “Dialog created”);
        setContentView(R.layout.mydialog);
    }
}

现在,我们就可以调用这个对话框类的show方法来让它显示:


MyDialog dialog = new MyDialog(context);
dialog.show();

对话框组件的事件处理机制和Activity是相同的,让我们来看下如何处理对话框中的OK和Cancle按钮的事件:

class MyDialog extends Dialog implements OnClickListener {
    private Button           okButton;
    private Button           cancelButton;
    private EditText         nameEditText;
   
    protected void onCreate(Bundle savedInstanceState) {
         okButton = (Button) findViewById(R.id.okButton);
         cancelButton = (Button) findViewById(R.id.cancelButton);
         nameEditText = (EditText) findViewById(R.id.nameEditText);
         okButton.setOnClickListener(this);
         cancelButton.setOnClickListener(this);
    }

    public void onClick(View view) {
        switch (view.getId()) {
             case R.id.okButton:
                  dismiss();
                  break;
            case R.id.cancelButton:
                  cancel();
                  break;
        }
    }
}

在对话框关闭时,对话框类的dismiss()方法将会被调用,该方法可以被对话框自身调用,也可以被其他外部代码调用。
对话框支持“取消”功能,“取消”的含义是指不再需要执行对话框上的任何功能和动作。对话框的取消可以通过调用cancel()方法来实现。取消对话框也将会自动调用dismiss()方法。
当用户点击手机设备上的“返回”按钮时,屏幕上的对话框将会被取消,如果你想让你的对话框不在这种情况下被取消掉的话,你可以如下设置你的对话框:

setCancelable(false);

对话框的取消和关闭事件可以通过OnCancelListener和OnDismissListener两个监听器来被监听处理。

从对话框中返回信息:
现在,到了我们要从对话框上获取用户输入的值,将它返回到主调的Activity中的时候了。然而, Dialog类并没有提供可以直接返回这些值的方法…但是,我们可以使用自己创建的监听类:

public interface MyDialogListener {
    public void onOkClick(String name);
    public void onCancelClick();
}

我们的对话框类的构造方法同时需要作一点小小的修改:

public MyDialog(Context context, MyDialogListener listener) {
    super(context);
    this.listener = listener;
}

接着,你就得在创建这个对话框的时候提供一个已经实现了MyDialogListener这接口的监听器实现对象了。
然后,我们要在对话框的onclick方法中传出这个值:

public void onClick(View view) {
    switch (view.getId()) {
        case R.id.okButton:
             listener.onOkClick(nameEditText.getText().toString());
             dismiss();
             break;
        case R.id.cancelButton:
            cancel();
            break;
    }
}

使用AlertDialog:
AlertDialog类是Dialog类的子类。它默认提供了3个按钮和一个文本消息。这些按钮可以按需要来使他们显示或隐藏。下列代码将创建一个AlertDialog对话框,对话框上将向用户展示一个问题以及备选的yes/no答案:

AlertDialog dialog = new AlertDialog.Builder(context).create();
dialog.setMessage(”Do you play cricket?”);
dialog.setButton(”Yes”, myOnClickListener);
dialog.setButton2(”No”, myOnClickListener);
dialog.show();

myOnClickListener这个事件监听器的代码可以类似如下:

public void onClick(DialogInterface dialog, int i) {
    switch (i) {
        case AlertDialog.BUTTON1:
           
           break;
        case AlertDialog.BUTTON2:
           
            break;
    }
}

AlertDialog.Builder:
AlertDialog类中有一个内部类,名为 ‘Builder’,Builder类提供了为对话框添加多选或单选列表,以及为这些列表添加事件处理的功能。另外,这个Builder类将 AlertDialog对话框上的3个按钮按照他们的位置分别称呼为:PositiveButton, NeutralButton, NegativeButton
下列代码是一个多选列表的例子:

new AlertDialog.Builder(context)
    .setIcon(R.drawable.icon)
    .setTitle(R.string.alert_dialog_multi_choice)
    .setMultiChoiceItems(
        R.array.select_dialog_items,
        new boolean[]{false, true, false, true, false},
        new DialogInterface.OnMultiChoiceClickListener() {
            public void onClick(DialogInterface dialog, int whichButton, boolean isChecked) {
               
            }
       }).setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
              
           }
       }).setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
                
            }
       }
    ).create();

 

Activity托管对话框:
Android也提供了创建对话框的快捷方式,在Activity中可以通过如showDialog(), onCreateDialog(), onPrepareDialog(),dismissDialog(), removeDialog()等方法来创建和管理对话框。
Activity的onCreateDialog方法用于在创建并显示对话框的时候调用,比如:

@Override
protected Dialog onCreateDialog(int id) {
    return new AlertDialog.Builder(this).setMessage(”How are you?”).setPositiveButton(
          ”Fine”,
          new DialogInterface.OnClickListener() {
              public void onClick(DialogInterface dialog, int which) {
                 
             }
          }).setNegativeButton(”Not so good”, new DialogInterface.OnClickListener() {
              public void onClick(DialogInterface dialog, int which) {
                
              }
          }
    ).create();
}

你可以同时创建多个对话框,通过为他们设置id参数来区分它们,然后可以通过 showDialog(id)方法来显示。 onCreateDialog方法只会在第一次调用showDialog方法时才会被调用,在之后的showDialog()的调用中,对话框不是被新建出来的,而是直接显示之前创建过的那些对话框。

如果你想要更新对话框的内容,你只要在 onPrepareDialog()中作相应的工作就可以了,该方法会在对话框显示之前进行调用。
dismissDialog()方法是用来关闭对话框的;removeDialog()方法用来将对话框从Activity的托管中移除(如果对已经移除的对话框重新进行调用showDialog ,则该对话框将进行重新创建)。

使用Dialog主题:
另外一种简单的显示对话框的方式是让Activity以Dialog的方式来工作(假装?) ,这种Activity被称作浮动Activity。这种Activity可以通过配置它的主题来实现,我们可以在AndroidManifest.xml中进行类似如下的配置:



这样,该Activity就会应用了 ‘Theme.Dialog’的主题而看起来像对话框了。

原文:http://www.oschina.net/discuss/thread/1567

本文转载自:http://blog.sina.com.cn/s/blog_3f7f41d40100egiv.html

kevin.gan
粉丝 6
博文 20
码字总数 0
作品 0
深圳
私信 提问
Android基础 - 对话框和浮动Activity[转]

在之前的学习过程中我们已经知道,Android应用中最常用的屏幕显示开发是基于Activity的,但是,在很多情况下我们需要显示一个对话框或浮动窗体来完成一些简单的任务,比如需要让用户输入一些...

kevin.gan
2010/01/06
2.5K
0
Android基础 - 对话框和浮动Activity

在之前的学习过程中我们已经知道,Android应用中最常用的屏幕显示开发是基于Activity的,但是,在很多情况下我们需要显示一个对话框或浮动窗体来完成一些简单的任务,比如需要让用户输入一些...

红薯
2009/07/14
8.9K
4
自定义透明样式Dialog以及对多输入框进行是否为空的判断

自定义自己的Dialog类,通过接口实现dialog上的控件的点击事件 package see.ilifeactivity; import ilife.see.R; import android.app.AlertDialog; import android.content.Context; import ......

wangwenya
2013/07/15
156
0
高仿美团app,浮动layout滑动到顶部悬停效果

做了个类似美团app的一个效果 当一个浮动layout的滑动到顶部时,这个浮动layout就悬停下来,当屏幕往下滑动时,浮动layout也跟着往下移动。 因此,我特意也写了一个:浮动layuot滑动到顶部悬...

谁带我去看看世界
2015/06/16
6.2K
4
Android Fragment---创建Fragment

要创建一个Fragment,你必须创建一个Fragment的子类(或一个既存的Fragment的子类)。Fragment类的代码看上去有点象Activity,它包含了类似Activity的的回调方法,如onCreate()、onStart()、...

长平狐
2012/10/16
681
1

没有更多内容

加载失败,请刷新页面

加载更多

Spring Boot 2 实战:使用 Spring Boot Admin 监控你的应用

1. 前言 生产上对 Web 应用 的监控是十分必要的。我们可以近乎实时来对应用的健康、性能等其他指标进行监控来及时应对一些突发情况。避免一些故障的发生。对于 Spring Boot 应用来说我们可以...

码农小胖哥
30分钟前
3
0
ZetCode 教程翻译计划正式启动 | ApacheCN

原文:ZetCode 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远。 ApacheCN 学习资源 贡献指南 本项目需要校对,欢迎大家提交 Pull Request。 ...

ApacheCN_飞龙
41分钟前
3
0
CSS定位

CSS定位 relative相对定位 absolute绝对定位 fixed和sticky及zIndex relative相对定位 position特性:css position属性用于指定一个元素在文档中的定位方式。top、right、bottom、left属性则...

studywin
50分钟前
6
0
从零基础到拿到网易Java实习offer,我做对了哪些事

作为一个非科班小白,我在读研期间基本是自学Java,从一开始几乎零基础,只有一点点数据结构和Java方面的基础,到最终获得网易游戏的Java实习offer,我大概用了半年左右的时间。本文将会讲到...

Java技术江湖
昨天
5
0
程序性能checklist

程序性能checklist

Moks角木
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部