android学习笔记(36)使用AlertDialog创建自定义对话框

2015-1-6 19:21:41     人阅读    

使用AlertDialog创建自定义对话框
         前面提到,使用AlertDialog还可以创建自定义对话框,例 如调用AlertDialog.Builder的setAdapter方法来确定列表项,就 可以生成自定义列表项的对话框。
          下面程序的界面布局文件也很简单,也是通过一个按钮来打 开对话框,故也不给出界向布局文件。该程序的代码关键在于传入一个SimP丨eAdaPter对象, 该Adapter对象用于为自定义列表项。
程序清单:CustomListDialog\src\org\crazyit\dialog\CustomListDialogjava

package org.crazyit.dialog;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.SimpleAdapter;
import android.widget.TextView;

public class CustomListDialog extends Activity
{
 final int LIST_DIALOG = 0x113;
 //定义3个列表项的名称
 private String[] names = new String[]
 { "神族", "虫族", "人族"};
 //定义3个列表项对应的图标
 private int[] imageIds = new int[]
 { R.drawable.p , R.drawable.z
  , R.drawable.t
 };
 @Override
 public void onCreate(Bundle savedInstanceState)
 {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  Button bn = (Button)findViewById(R.id.bn);
  //为按钮绑定事件监听器
  bn.setOnClickListener(new View.OnClickListener()
  {
   @Override
   public void onClick(View source)
   {
    //显示对话框
    showDialog(LIST_DIALOG);
   }
  });
 }
 //重写onCreateDialog方法创建对话框
 @Override
 public Dialog onCreateDialog(int id, Bundle state)
 {
  //判断需要生成哪种类型的对话框
  switch (id)
  {
   case LIST_DIALOG:
    Builder b = new AlertDialog.Builder(this);
    // 设置对话框的图标
    b.setIcon(R.drawable.tools);
    // 设置对话框的标题
    b.setTitle("单选列表对话框");
    //创建一个List对象,List对象的元素是Map
    List<Map<String, Object>> listItems = new ArrayList<Map<String, Object>>();
    for (int i = 0; i < names.length; i++)
    {
     Map<String, Object> listItem = new HashMap<String, Object>();
     listItem.put("header", imageIds[i]);
     listItem.put("personName", names[i]);
     listItems.add(listItem);
    }
    //创建一个SimpleAdapter
    SimpleAdapter simpleAdapter = new SimpleAdapter(this
     , listItems 
     , R.layout.row
     , new String[]{ "personName", "header" }
     , new int[]{R.id.name , R.id.header});
    
    // 为对话框设置多个列表
    b.setAdapter(simpleAdapter    
     //为列表项的单击事件设置监听器
     , new DialogInterface.OnClickListener()
     {
      @Override
      public void onClick(DialogInterface dialog,
       int which)
      {
       TextView show = (TextView) findViewById(R.id.show);
       // which代表哪个列表项被单击了
       show.setText("您最擅长的种族为:" + names[which]);

      }
     });
    // 创建对话框
    return b.create();
  }
  return null;
 }
}

       上面的程序中粗体字代码先创建了一个SimpleAdapter对 象,接着程序利用SimpleAdapter创建了一个对话框,那么该对 话框的列表项将由该Adapter决定。运行上面的程序,单击“选 择您最擅长的种族”按钮,程序显示如图2.51所示的界面。
        除此之外,如果幵发者希望完全控制对话框内容,也是完 全允许的,AlertDialog.Builder 还提供了 一个 setView(View view) 方法,该方法允许设置对话框所显示的内容为View组件——当 然此处的View组件完全可以是一个XxxLayout容器。
       下面以一个登录对话框来介绍自定义对话框的用法。
实例:登录对话框
要想定义一个登录对话框,应该先定义一个登录的界面布局,该界面的布局文件如下。 程序清单:codes\02\2.5\LoginDialog\res\layout\login.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"
 android:gravity="center_horizontal"
 >
<Button  
 android:id="@+id/bn"
 android:layout_width="wrap_content" 
 android:layout_height="wrap_content" 
 android:text="显示登录对话框"
 />
</LinearLayout>

上面的界面布局定义了登录用的三个输入框:输入用户名的文本框、输入密码的密码框、 输入电话号码的输入框。接下来在应用程序中调用AlertDialog.Builder的setView(View view) 方法让对话框显示该输入界面即可。
该程序与前面介绍的列表对话框程序比较相似,只是将原来的调用setltems设置列表项,改为现在的调用setView来设置自定义视图。下面给出该程序的关键代码。
程序清单:\LoginDialog\src\org\crazyit\dialog\LoginDialog.java

package org.crazyit.dialog;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TableLayout;


public class LoginDialog extends Activity
{
 @Override
 public void onCreate(Bundle savedInstanceState)
 {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  Button bn = (Button)findViewById(R.id.bn);
  //定义一个AlertDialog.Builder对象
  final Builder builder = new AlertDialog.Builder(this);
  //为按钮绑定事件监听器
  bn.setOnClickListener(new View.OnClickListener()
  {
   @Override
   public void onClick(View source)
   {
    // 设置对话框的图标
    builder.setIcon(R.drawable.tools);
    // 设置对话框的标题
    builder.setTitle("自定义普通对话框");
    //装载/res/layout/login.xml界面布局
    TableLayout loginForm = (TableLayout)getLayoutInflater()
     .inflate( R.layout.login, null);
    // 设置对话框显示的View对象
    builder.setView(loginForm);
    // 为对话框设置一个“确定”按钮
    builder.setPositiveButton("登录"
     // 为按钮设置监听器
     , new OnClickListener()
     {
      @Override
      public void onClick(DialogInterface dialog, int which)
      {
       //此处可执行登录处理
      }
     });
    // 为对话框设置一个“取消”按钮
    builder.setNegativeButton("取消"
     ,  new OnClickListener()
     {
      @Override
      public void onClick(DialogInterface dialog, int which)
      {
       //取消登录,不做任何事情。
      }
     });
    //创建、并显示对话框
    builder.create().show();
   }
  });
 }
}

上面的程序中第一行粗体字代码显式装载了/res/layout/login.xml文件,并返回该文件对应的TableLayout 作为 View,接下来程序调用了 AlertDialog.Builder 的 setView()
方法来显示上一行代码所获得的TableLayout。

实例:对话框风格的窗口
还有一种自定义对话框的方式,这种对话框本质上依然是窗口,只是把显示窗口的 Activity的风格设为对话框风格即可。
下面的程序定义一个简单的界面布局,该界面布局里包含一个Image View和一个Button。 接下来程序使用Activity来显示该界面布局。
程序清单:MockDialog\src\org\crazyit\dialog\MockDialog.java

package org.crazyit.dialog;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MockDialog extends Activity
{
 @Override
 public void onCreate(Bundle savedInstanceState)
 {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  Button bn = (Button)findViewById(R.id.bn);
  //为按钮绑定事件监听器
  bn.setOnClickListener(new OnClickListener()
  {
   @Override
   public void onClick(View arg0)
   {
    //结束该Activity
    finish();    
   }
  });
 }
}


上面的程序仅仅是为界面上的按钮绑定了一个监听器,当该按钮被单击时结束该Activity。
接下来在AndroidManifest.xml文件中指定该窗口以对话框风格显不,也就是在该清单文 件中使用如下配置片段:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="org.crazyit.dialog"
   android:versionCode="1"
   android:versionName="1.0">
 <application android:icon="@drawable/icon" android:label="@string/app_name">
  <activity android:name=".MockDialog"
    android:theme="@android:style/Theme.Dialog"
    android:label="@string/app_name">
   <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
   </intent-filter>
  </activity>

 </application>
</manifest> 


上面的粗体字代码指定MockDialog使用对话框风格进行 显示


 使用 Popup Window
            PopupWindow可以创建类似于对话框风格的窗口,使用 PopupWindow创建对话框风格的窗口只要如下两步即可:
             调用PoPuPWindow 的构造器创建PoPuPWindow 对象。
             调用 PoPuPWindow 的 showAsDropDown(View v)将 PopupWindow 作为 v 组件的下拉 组件显示出来;或调用PopupWindow的showAtLocation方法将PopupWindow在指定位置显示出来。
             下面的程序示范了如何使用PopupWindow创建对话框风格的窗口,该程序的主程序中只 有一个简单的按钮,用户单击该按钮时将会显示PopupWindow;其中PopupWindow负责加载并显示前一个示例的窗口界面。


该程序代码如下。
程序清单:PopupWindowTest\src\org\crazyit\dialog\PopupWindowTest.java

package org.crazyit.dialog;

import android.app.Activity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.PopupWindow;


public class PopupWindowTest extends Activity
{
 @Override
 public void onCreate(Bundle savedInstanceState)
 {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  // 装载R.layout.popup对应的界面布局
  View root = this.getLayoutInflater().inflate(R.layout.popup, null);
  // 创建PopupWindow对象
  final PopupWindow popup = new PopupWindow(root, 280, 360);
  Button button = (Button) findViewById(R.id.bn);
  button.setOnClickListener(new OnClickListener()
  {
   @Override
   public void onClick(View v)
   {
    // 以下拉方式显示。
//    popup.showAsDropDown(v);
    //将PopupWindow显示在指定位置
    popup.showAtLocation(findViewById(R.id.bn), Gravity.CENTER, 20,
     20);
   }
  });
  // 获取Popup窗口中的关闭按钮。
  root.findViewById(R.id.close).setOnClickListener(
   new View.OnClickListener()
   {
    public void onClick(View v)
    {
     // 关闭Popup窗口
     popup.dismiss();
    }
   });
 }
}


上面的程序中第一行粗体字代码用于创建poPuPwindow对象,接下来的两行粗体字代码 分别示范了两种显示PopupWindow的方式:以下拉方式显示和在指定位置显示,这就是在程 序中创建并显示PopupWindow的关键代码。程序中①号粗体字代码负责销毁、隐藏 PopupWindow对象——当用户单击PopupWindow中的“关闭”按钮时,该PopupWindow将会关闭。


原文地址:http://www.itmmd.com/201501/449.html
该文章由 萌萌的IT人 整理发布,转载须标明出处。

recyclerview 动画效果实现   上一篇
下一篇  android学习笔记(35)android AlertDialog创建列表对话框[2]
精彩回复
我要追加问题,请求站长解决!
姓名:       

《程序员app》专门为程序员量身定做!