Dialog 一般指可以顯示在 Activity 前面的小窗口,當(dāng)前的 Activity 失去焦點(Focus),Dialog 將接受用戶輸入,一般可以用來顯示消息或接受用戶輸入等等。使用 Dialog 時一般不需要直接創(chuàng)建 Dialog 類的實例。而是可以使用AlertDialog,ProgressDialog,DatePickerDialog,TimePickerDialog。最常用的是AlertDialog。下面就以使用 AlertDialog 為例,使用 AlertDialog 來選擇顯示圖像的三個例子:DrawMap, JumbleImage,SeeThroughImage。其中 DrawMap 暫時不介紹,將在后面介紹 Internet 應(yīng)用顯示在線地圖時再說。
通常 Dialog 是作為 Activity 一部分來創(chuàng)建的,也就是說在 Activity 的 onCreateDialog(int)中創(chuàng)建。當(dāng)在 onCreateDialog(int)創(chuàng)建 Dialog 時,Android 系統(tǒng)將自動管理 Dialog 的狀態(tài),并把當(dāng)前 Activity 作為 Dialog 的所有者。并且 Dialog 也繼承當(dāng)前 Activity 的一些屬性,比如說 Option Menu。
創(chuàng)建好 Dialog 后,可以使用 showDialog(int) 來顯示 Dialog ,showDialog 的參數(shù)為 Dialog的 ID。在顯示 Dialog 之前,如果想對 Dialog 做些改動,可以在 onPrepareDialog(int, Dialog) 添加代碼。dismiss()關(guān)閉對話框。如果在 Activity 中則使用 dismissDialog(int) 。
本例中使用一個按鈕來觸發(fā) Dialog,在 res\layout 在添加 images.xml
<?xml version=”1.0″ encoding=”utf-8″?>
<LinearLayout xmlns:android=”[http://schemas.android.com/apk/res/android](http://schemas.android.com/apk/res/android)”
android:orientation=”vertical”
android:background=”@drawable/white”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”>
<com.pstreets.graphics2d.GuidebeeGraphics2DView
android:id=”@+id/graphics2dview”
android:layout_weight=”1″
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”/>
<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
android:layout_width=”wrap_content” android:layout_height=”wrap_content”
android:orientation=”horizontal”
>
<Button android:text=”Images”
android:id=”@+id/btnImages”
android:layout_width=”wrap_content”
android:textColor=”@color/black”
android:checked=”true”
android:layout_height=”wrap_content”>
</Button>
</LinearLayout>
</LinearLayout>
修改 Image.java
public class Images extends Graphics2DActivity
implements OnClickListener{
private Button btnImages;
private int[] imageDuke;
static final private int IMAGE_DIALOG=1;
int w, h;
int offX, offY;
int alpha = 128;
FontEx font = FontEx.getSystemFont();
int fontSize = 24;
Pen pen = new Pen(Color.RED, 2);
char[] message = "Guidebee".toCharArray();
int widthOfMessage = 0;
private int numlocs = 2;
private int numcells = numlocs * numlocs;
private int[] cells;
int cw, ch;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.images);
graphic2dView = (GuidebeeGraphics2DView)
findViewById(R.id.graphics2dview);
btnImages = (Button) findViewById(R.id.btnImages);
btnImages.setOnClickListener(this);
Bitmap bitmap
= BitmapFactory.decodeResource(getResources(),
R.drawable.duke_skateboard);
imageDuke = new int[bitmap.getHeight()
* bitmap.getWidth()];
bitmap.getPixels(imageDuke, 0, bitmap.getWidth(), 0, 0,
bitmap.getWidth(), bitmap.getHeight());
widthOfMessage = font.charsWidth(message, 0,
message.length, fontSize);
w=bitmap.getWidth();
h=bitmap.getHeight();
offX = (SharedGraphics2DInstance.CANVAS_WIDTH - w) / 2;
offY = (SharedGraphics2DInstance.CANVAS_HEIGHT - h) / 2;
cw = w / numlocs;
ch = h / numlocs;
cells = new int[numcells];
for (int i = 0; i < numcells; i++) {
cells[i] = i;
}
}
private void drawJumbleImage(){
Random rand = new Random();
int ri;
for (int i = 0; i < numcells; i++) {
while ((ri = rand.nextInt(numlocs)) == i) {
}
int tmp = cells[i];
cells[i] = cells[ri];
cells[ri] = tmp;
}
graphics2D.clear(Color.WHITE);
graphics2D.Reset();
int dx, dy;
for (int x = 0; x < numlocs; x++) {
int sx = x * cw;
for (int y = 0; y < numlocs; y++) {
int sy = y * ch;
int cell = cells[x * numlocs + y];
dx = (cell / numlocs) * cw;
dy = (cell % numlocs) * ch;
graphics2D.drawImage(imageDuke, w, h,
dx + offX, dy + offY,
sx, sy, cw, ch);
}
}
graphic2dView.refreshCanvas();
}
private void drawSeeThroughImage(){
alpha += 16;
if(alpha>255) alpha=0;
graphics2D.clear(Color.WHITE);
graphics2D.Reset();
graphics2D.setDefaultPen(pen);
graphics2D.drawChars(font, fontSize, message,
0, message.length, offX
+ (w - widthOfMessage) / 2, offY + h / 2);
graphics2D.drawImage(imageDuke, w, h,
offX, offY,
0xFFFF00FF, alpha);
graphic2dView.refreshCanvas();
}
protected Dialog onCreateDialog(int id) {
Dialog dialog;
switch(id) {
case IMAGE_DIALOG:
final CharSequence[] items = {"DrawMap",
"JumbleImage","SeeThroughImage"};
AlertDialog.Builder builder
= new AlertDialog.Builder(this);
builder.setTitle("Images");
builder.setSingleChoiceItems(items,
-1, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int item) {
switch(item){
case 0:
break;
case 1:
drawJumbleImage();
break;
case 2:
drawSeeThroughImage();
break;
}
dialog.dismiss();
}
});
AlertDialog alert = builder.create();
dialog=alert;
break;
default:
dialog = null;
}
return dialog;
}
@Override
protected void drawImage() {
drawJumbleImage();
}
@Override
public void onClick(View view) {
showDialog(IMAGE_DIALOG);
}
}
從代碼中看到,Dialog 是通過 AlertDialog.Builder 來創(chuàng)建的,這里 Dialog 顯示了三個選項,通過 builder.setSingleChoiceItems 添加處理事件。實際 AlertDialog 可以有多種選項,具體請參考 Android AlertDialog 文檔。
http://wiki.jikexueyuan.com/project/android-development-tutorial/images/27.png" alt="" />