Dialog 一般指可以顯示在 Activity 前面的小窗口,當(dāng)前的 Activity 失去焦點(diǎn)(Focus),Dialog 將接受用戶輸入,一般可以用來(lái)顯示消息或接受用戶輸入等等。使用 Dialog 時(shí)一般不需要直接創(chuàng)建 Dialog 類的實(shí)例。而是可以使用AlertDialog,ProgressDialog,DatePickerDialog,TimePickerDialog。最常用的是AlertDialog。下面就以使用 AlertDialog 為例,使用 AlertDialog 來(lái)選擇顯示圖像的三個(gè)例子:DrawMap, JumbleImage,SeeThroughImage。其中 DrawMap 暫時(shí)不介紹,將在后面介紹 Internet 應(yīng)用顯示在線地圖時(shí)再說(shuō)。
通常 Dialog 是作為 Activity 一部分來(lái)創(chuàng)建的,也就是說(shuō)在 Activity 的 onCreateDialog(int)中創(chuàng)建。當(dāng)在 onCreateDialog(int)創(chuàng)建 Dialog 時(shí),Android 系統(tǒng)將自動(dòng)管理 Dialog 的狀態(tài),并把當(dāng)前 Activity 作為 Dialog 的所有者。并且 Dialog 也繼承當(dāng)前 Activity 的一些屬性,比如說(shuō) Option Menu。
創(chuàng)建好 Dialog 后,可以使用 showDialog(int) 來(lái)顯示 Dialog ,showDialog 的參數(shù)為 Dialog的 ID。在顯示 Dialog 之前,如果想對(duì) Dialog 做些改動(dòng),可以在 onPrepareDialog(int, Dialog) 添加代碼。dismiss()關(guān)閉對(duì)話框。如果在 Activity 中則使用 dismissDialog(int) 。
本例中使用一個(gè)按鈕來(lái)觸發(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 是通過(guò) AlertDialog.Builder 來(lái)創(chuàng)建的,這里 Dialog 顯示了三個(gè)選項(xiàng),通過(guò) builder.setSingleChoiceItems 添加處理事件。實(shí)際 AlertDialog 可以有多種選項(xiàng),具體請(qǐng)參考 Android AlertDialog 文檔。
http://wiki.jikexueyuan.com/project/android-development-tutorial/images/27.png" alt="" />