現在要說的是自定義對話框。
常用的對話框有好多網友們整理的資料,對話框大全啊神馬的。但是除了常用對話框外,有時候要根據自己的需求定義新的對話框,下面就稍微說一下自定義對話框的一種做法。
1、需要一個對話框內容的xml配置文件game_dialog.xml,這個應該不需要過多解釋,基本佈局而已。
有幾個圖片按鈕,所以在drawable下面放幾張圖,嫌麻煩的話,也可以用Button替換,看下效果。
需要說明的是,所有控件的id這裏我都用的@id,因爲id我都寫在了res/values/ids.xml裏面,如果不這樣做的話要用@+id,不過不好管理,雖然我在代碼管理這塊做的並不是特別好,但是儘量盡我所能讓他們看起來乾淨清晰簡潔明瞭,也會做一些註釋,以後回來看或者做改動也會舒心一點。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_vertical|center_horizontal|center" android:orientation="vertical" > <TextView android:id="@id/id_dialog_message" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:textSize="20sp" android:text="輸出message" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:orientation="horizontal" > <ImageButton android:id="@id/id_dialog_next" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:background="#00000000" android:src="@drawable/dialog_next" /> <ImageButton android:id="@id/id_dialog_replay" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:background="#00000000" android:src="@drawable/dialog_replay" /> <ImageButton android:id="@id/id_dialog_continue" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:background="#00000000" android:src="@drawable/dialog_continue" /> <ImageButton android:id="@id/id_dialog_quit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:background="#00000000" android:src="@drawable/dialog_quit" /> </LinearLayout> </LinearLayout>
ids.xml如下:
<?xml version="1.0" encoding="utf-8"?> <resources> <item name="id_dialog_next" type="id"></item> <item name="id_dialog_replay" type="id"></item> <item name="id_dialog_continue" type="id"></item> <item name="id_dialog_quit" type="id"></item> <item name="id_dialog_message" type="id"></item> </resources>
2、在res/values下的styles.xml中添加如下內容,定義一個名爲GameDialog的style,然後設置一些item,基本看意思就能明白,其中android:windowBackground的值可以使用一張圖片,也可以使用一個xml文件做配置,用xml會稍微美觀一點,用圖片的話,我目前還不太會找圖,不知道怎麼搭配好看。下面也附上我用的shape.xml的源碼。
<style name="GameDialog" parent="@android:Theme.Dialog"> <item name="android:windowFrame">@null</item> <item name="android:windowNoTitle">true</item> <item name="android:windowBackground">@drawable/shape</item> <item name="android:windowIsFloating">true</item> <item name="android:windowIsTranslucent">true</item> <item name="android:windowContentOverlay">@null</item> <item name="android:backgroundDimEnabled">false</item> </style>
shap.xml如下:
<?xml version="1.0" encoding="UTF-8"?> <shape android:shape="rectangle" xmlns:android="http://schemas.android.com/apk/res/android"> <!-- <solid android:color="#55222222"/>--> <solid android:color="#e0000000"/> <corners android:radius="5dp" /> <padding android:left="6dp" android:top="6dp" android:right="6dp" android:bottom="6dp"/> </shape>
3、定義一個類繼承自Dialog並實現OnClickListener接口,使用setContentview加載視圖,用findViewById獲取對話框中的View對象實例(不知道這樣說對不對啊?),和我們平時使用一樣,可以爲他們設置監聽事件。
需要說一下的是這兩句:
this.setCancelable(false);
見名知意,就是屏蔽掉按返回鍵關閉對話框,有時候會有這種需要,強制要求必須做一個選擇。
this.dismiss();
這個是關閉掉對話框的。
以下是GameDialog的源代碼:
package com.test.leetledialog; import android.app.Dialog; import android.content.Context; import android.view.View; import android.widget.ImageButton; import android.widget.TextView; /** * 自定義消息通知對話框 * @author Leetle * */ public class GameDialog extends Dialog implements android.view.View.OnClickListener { private TextView gd_message; private ImageButton gd_next; private ImageButton gd_replay; private ImageButton gd_continue; private ImageButton gd_quit; public GameDialog(Context context, String message) { super(context, R.style.GameDialog); setContentView(R.layout.game_dialog); gd_message = (TextView) findViewById(R.id.id_dialog_message); gd_next = (ImageButton) findViewById(R.id.id_dialog_next); gd_continue = (ImageButton) findViewById(R.id.id_dialog_continue); gd_replay = (ImageButton) findViewById(R.id.id_dialog_replay); gd_quit = (ImageButton) findViewById(R.id.id_dialog_quit); // 設置提示消息 gd_message.setText(message); // 設置按鈕監聽 gd_next.setOnClickListener(this); gd_quit.setOnClickListener(this); gd_continue.setOnClickListener(this); gd_replay.setOnClickListener(this); // 設置不能通過返回鍵取消 this.setCancelable(false); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.id_dialog_next: { System.out.println("GameDialog next"); this.dismiss(); break; } case R.id.id_dialog_continue: { System.out.println("GameDialog continue"); this.dismiss(); break; } case R.id.id_dialog_replay: { System.out.println("GameDialog replay"); this.dismiss(); break; } case R.id.id_dialog_quit: { System.out.println("GameDialog quit"); this.dismiss(); break; } default: { } } } }
4、在MainActivity中打開一個窗口
package com.test.leetledialog; import android.os.Bundle; import android.app.Activity; import android.view.Menu; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //new一個GameDialog GameDialog gameDialog; gameDialog = new GameDialog(MainActivity.this,"看我看我快看我"); gameDialog.show(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } }
歐了,運行結果如下圖。話說這個代碼不能摺疊麼?
安卓應用-自定義對話框結束!
2014.12.30