Android界面编程之九 对话框

Android提供了丰富的对话框支持,它提供如下4种常用对话框:
AlertDialog
实际应用最广泛的对话框
ProgressDialog
进度对话框,只是对简单进度条的封装
DatePickerDialog
日期选择对话框
TimePickerDialog
时间选择对话框


2.9.1 AlertDialog
AlertDialog功能很强大,可以生成各种内容的对话框,但实际上,AlertDialog生成的对话框总有一个大致结构,可以分为4个区域:图标区、标题区、内容区、按钮区
从上面的对话框的结构来看,创建对话框需要进过如下几步:
  1. 使用创建AlertDialog.Builder对象
  2. 调用AlertDialog.Builder的setTitle()或setCustomTitle()方法设置标题
  3. 调用AlertDialog.Builder的setIcon()方法设置标题
  4. 调用AlertDialog.Builder的相关设置方法设置对话框内容
  5. 调用AlertDialog.Builder的setPositiveButton()、setNegativeButton()或NeutralButton()方法添加多个按钮
  6. 调用AlertDialog.Builder的create()创建AlertDialog对象,再调用AlertDialog对象的show()将该对话框显示出来
可以看出,第4个步骤是最灵活的,AlertDialog允许创建各种内容的对话框,AlertDialog提供了以下6种方法来制定对话框内容
setMessage()
设置为简单文本内容
setItems()
设置为简单列表项
setSingleChoiceItems()
设置对话框内容为单选列表项
setMultiChoiceItems()
设置对话框内容为多选列表项
setAdapter()
设置为自定义列表项
setView()
自定义View
示例代码:
public class MainActivity extends Activity {

TextView
show ;
String[]
items = new String[] {
"疯狂Java讲义" , "疯狂Ajax讲义" ,
"轻量级Java EE企业应用实战" ,
"疯狂Android讲义" };
@Override
protected void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.
activity_main );
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.
main , menu);
return true ;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id. action_settings ) {
return true ;
}
return super .onOptionsItemSelected(item);
}

public void simple(View source) {
AlertDialog.Builder builder =
new AlertDialog.Builder( this )
.setTitle(
"simple alert dialog" )
.setIcon(R.drawable.
ic_launcher )
.setMessage(
"test content\n secon row content" );
setPositiveButton(builder);
setNegativeButton(builder).create().show();
}

private AlertDialog.Builder setPositiveButton(AlertDialog.Builder builder)
{
return builder.setPositiveButton( "Sure" , new OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
show .setText( "clicked 'sure' button" );
}
});
}
private AlertDialog.Builder setNegativeButton(AlertDialog.Builder builder)
{
return builder.setNegativeButton( "Cancel" , new OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
show .setText( "clicked 'cancel' button" );
}
});
}

public void simpleList(View source)
{
AlertDialog.Builder builder =
new AlertDialog.Builder( this )
.setTitle(
"simple list dialog" )
.setIcon(R.drawable.
ic_launcher )
.setItems(
items , new OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
show .setText( "you pick <" + items [which] + ">" );
}
});
setPositiveButton(builder);
setNegativeButton(builder).create().show();

}

public void singleChoice(View source)
{
AlertDialog.Builder builder =
new AlertDialog.Builder( this )
.setTitle(
"single choice dialog" )
.setIcon(R.drawable.
ic_launcher )
.setSingleChoiceItems(
items , 1, new OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
show .setText( "you pick <" + items [which] + ">" );
}
});
setPositiveButton(builder);
setNegativeButton(builder).create().show();

}

public void multiChoice(View source)
{
AlertDialog.Builder builder =
new AlertDialog.Builder( this )
.setTitle(
"multiple choice dialog" )
.setIcon(R.drawable.
ic_launcher )
.setMultiChoiceItems(
items ,
new boolean []{ false , true , false , true }, null );
setPositiveButton(builder);
setNegativeButton(builder).create().show();

}

public void customList(View source)
{
AlertDialog.Builder builder =
new AlertDialog.Builder( this )
.setTitle(
"custom list dialog" )
.setIcon(R.drawable.
ic_launcher )
.setAdapter(
new ArrayAdapter<String>( this ,
R.layout.
array_item , items ), null );
setPositiveButton(builder);
setNegativeButton(builder).create().show();

}


public void customView(View source)
{
TableLayout loginForm = (TableLayout) getLayoutInflater()
.inflate(R.layout.
login , null );
new AlertDialog.Builder( this )
.setTitle(
"custom view dialog" )
.setIcon(R.drawable.
ic_launcher )
.setView(loginForm)
.setPositiveButton(
"login" , new OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
// login operation
}
})
.setNegativeButton(
"cancel" , new OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
// login operation
}
})
.create()
.show();
}
}

2.9.2 对话框风格的窗口
          <activity
               android:name=".DialogTheme"
               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>

2.9.3 PopupWindow
可以创建类似对话框风格的窗口,只需要如下两个步骤即可:
  1. 调用PopupWindow 的构造器创建PopupWindow对象
  2. 调用PopupWindow的showAsDropDown(View v) 将PopupWindow在指定位置显示出来
示例代码:
public class MainActivity extends ActionBarActivity {
   
@ Override
   
protected void onCreate(Bundle savedInstanceState) {
       
super .onCreate(savedInstanceState);
        setContentView(R.layout.
activity_main );
        View root =
this .getLayoutInflater().inflate(R.layout. popup , null );
       
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.showAtLocation(findViewById(R.id.
bn ), Gravity. CENTER , 20, 20);
        }
        });
        root.findViewById(R.id.
close ).setOnClickListener(
       
new View.OnClickListener() {

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
popup.dismiss();
}
});
    }
}

2.9.4 DatPickerDialog、TimePickerDialog
使用这两种Dialog的步骤也较简单,只需要两个步骤即可:
  1. 通过new关键字创建实例,调用他们的show()即可显示对话框
  2. 为它们绑定监听器
示例代码:
public class MainActivity extends ActionBarActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.
activity_main );
Button dateBn = (Button) findViewById(R.id.
dateBn );
Button timeBn = (Button) findViewById(R.id.
timeBn );
dateBn.setOnClickListener(
new OnClickListener() {
@Override
public void onClick(View source) {
Calendar c = Calendar.getInstance();
new DatePickerDialog(MainActivity. this ,
new DatePickerDialog.OnDateSetListener() {

@Override
public void onDateSet(DatePicker dp, int year,
int month, int dayOfMonth) {
// TODO Auto-generated method stub
EditText show = (EditText) findViewById(R.id.
show );
show.setText(
"you've picked : " + year + "."
+ month + 1 +
"." + dayOfMonth);
}

}
, c.get(Calendar.
YEAR )
, c.get(Calendar.
MONTH )
, c.get(Calendar.
DAY_OF_MONTH )).show();
}
});
timeBn.setOnClickListener(
new OnClickListener() {
@Override
public void onClick(View source) {
Calendar c = Calendar.getInstance();
new TimePickerDialog(MainActivity. this ,
new TimePickerDialog.OnTimeSetListener() {

@Override
public void onTimeSet(TimePicker tp, int hourOfDay,
int minute) {
// TODO Auto-generated method stub
EditText show = (EditText) findViewById(R.id.
show );
show.setText(
"you've picked : " + hourOfDay + ":"
+ minute );
}

}
, c.get(Calendar.
HOUR_OF_DAY )
, c.get(Calendar.
MINUTE )
,
true ).show();
}
});
}
}

2.9.5 ProgressDialog
ProgressDialog代表了进度对话框,程序只要创建ProgressDialog实例,并将它显示出来就是一个进度对话框。有如下两种方式创建对话框:
  1. show()
  2. 设置后显示
设置的常用方法有:
setIndeterminate(boolean indeterminate)
设置对话框里的进度条不显示进度值
setMax(int max)
设置对话框里进度条的最大值
setMessage(CharSequence message)
设置对话框里显示的消息
setProgress(int value)
设置对话框里进度条里显示的消息
setProgressStyle(int style)
设置对话框里进度条的风格
示例代码:
public class MainActivity extends ActionBarActivity {

final static int MAX_PROGRESS = 100;
private int [] data = new int [50];
int progressStatus = 0;
int hasData = 0;
ProgressDialog
pd1 , pd2 ;
Handler
handler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
if (msg. what == 0x123)
{
pd2 .setProgress( progressStatus );
}
}
};
   
@Override
   
protected void onCreate(Bundle savedInstanceState) {
       
super .onCreate(savedInstanceState);
        setContentView(R.layout.
activity_main );
    }

   
public void showSpinner(View source)
    {
   
pd1 = new ProgressDialog(MainActivity. this );
   
pd1 .setTitle( "mission excuting" );
   
pd1 .setMessage( "please wait" );
   
pd1 .setCancelable( true );
   
pd1 .setProgressStyle(ProgressDialog. STYLE_HORIZONTAL );
   
pd1 .setIndeterminate( true );
   
pd1 .show();
    }
   
public void showProgress(View source)
    {
   
progressStatus = 0;
   
hasData = 0;
   
pd2 = new ProgressDialog(MainActivity. this );
   
pd2 .setMax( MAX_PROGRESS );
   
pd2 .setTitle( "mission completed percentage" );
   
pd2 .setMessage( "completed part" );
   
pd2 .setCancelable( false );
   
pd2 .setProgressStyle(ProgressDialog. STYLE_HORIZONTAL );
   
pd2 .setIndeterminate( true );
   
pd2 .show();
   
new Thread()
    {
   
public void run()
    {
   
while ( progressStatus < MAX_PROGRESS )
    {
   
progressStatus = MAX_PROGRESS
    * doWork() /
data . length ;
   
handler .sendEmptyMessage(0x123);
    }
   
if ( progressStatus >= MAX_PROGRESS )
    {
   
pd2 .dismiss();
    }
    }
    }.start();
    }
   
public int doWork()
    {
   
data [ hasData ++] = ( int ) (Math.random() * 100);
   
try
    {
    Thread.sleep(100);
    }
   
catch (InterruptedException e)
    {
    e.printStackTrace();
    }
   
return hasData ;
    }

}
main.xml代码:
< LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
   
xmlns:tools = "http://schemas.android.com/tools"
   
android:layout_width = "match_parent"
   
android:layout_height = "match_parent"
   
android:orientation = "vertical"
   
android:gravity = "center_horizontal" >

    
   
< Button
       
android:layout_width = "match_parent"
       
android:layout_height = "wrap_content"
        android:text = "progress status"
       
android:onClick = "showSpinner" />
   
< Button
       
android:layout_width = "match_parent"
       
android:layout_height = "wrap_content"
       
android:text = "hide status"
       
android:onClick = "showIndeterminate" />
   
< Button
       
android:layout_width = "match_parent"
       
android:layout_height = "wrap_content"
       
android:text = "show status"
       
android:onClick = "showProgress" />

</ LinearLayout >
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值