本人小菜一個。目前只見過兩種彈出框的實現方式,第一種是最常見的PopupWindow,第二種也就是Activity的方式是前幾天才見識過。感覺很霸氣哦。沒想到,activity也可以做偽窗口。
先貼上最常見的方法,主要講activity的方法。
一、彈出PopupWindow
1 /**
2 * 彈出menu菜單
3 */
4 public void menu_press(){
5 if(!menu_display){
6 //獲取LayoutInflater實例
7 inflater = (LayoutInflater)this.getSystemService(LAYOUT_INFLATER_SERVICE);
8 //這里的main布局是在inflate中加入的哦,以前都是直接this.setContentView()的吧?呵呵
9 //該方法返回的是一個View的對象,是布局中的根
10 layout = inflater.inflate(R.layout.main_menu, null);
11
12 //下面我們要考慮了,我怎樣將我的layout加入到PopupWindow中呢???很簡單
13 menuWindow = new PopupWindow(layout,LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); //后兩個參數是width和height
14 //menuWindow.showAsDropDown(layout); //設置彈出效果
15 //menuWindow.showAsDropDown(null, 0, layout.getHeight());
16
17 //設置如下四條信息,當點擊其他區域使其隱藏,要在show之前配置
18 menuWindow.setFocusable(true);
19 menuWindow.setOutsideTouchable(true);
20 menuWindow.update();
21 menuWindow.setBackgroundDrawable(new BitmapDrawable());
22
23 mClose = (LinearLayout)layout.findViewById(R.id.menu_close);
24 menuWindow.showAtLocation(this.findViewById(R.id.schoolmain), Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL, 0,50); //設置layout在PopupWindow中顯示的位置
25 //如何獲取我們main中的控件呢?也很簡單
26 mMainbtn = (LinearLayout)layout.findViewById(R.id.menu_main_btn);
27 mHistorybtn = (LinearLayout) layout.findViewById(R.id.menu_history_btn);
28 mHelpbtn = (LinearLayout) layout.findViewById(R.id.menu_help_btn);
29
30
31
32 //下面對每一個Layout進行單擊事件的注冊吧。。。
33 //比如單擊某個MenuItem的時候,他的背景色改變
34 //事先准備好一些背景圖片或者顏色
35 mMainbtn.setOnClickListener (new View.OnClickListener() {
36 @Override
37 public void onClick(View arg0) {
38 mywebView.loadUrl(URL);
39 menuWindow.dismiss(); //響應點擊事件之后關閉Menu
40 }
41 });
42 mHelpbtn.setOnClickListener (new View.OnClickListener() {
43 @Override
44 public void onClick(View arg0) {
45 mywebView.loadUrl(URL);
46 menuWindow.dismiss(); //響應點擊事件
47 }
48 });
49 mHistorybtn.setOnClickListener (new View.OnClickListener() {
50 @Override
51 public void onClick(View arg0) {
52 mywebView.loadUrl(URL);
53 menuWindow.dismiss(); //響應點擊事件
54 }
55 });
56 menu_display = true;
57 }else{
58 //如果當前已經為顯示狀態,則隱藏起來
59 menuWindow.dismiss();
60 menu_display = false;
61 }
62
63 }
64
65 public void back_press(){
66
67 if(menu_display){ //如果 Menu已經打開 ,先關閉Menu
68 menuWindow.dismiss();
69 menu_display = false;
70 }
71 else {
72 Intent intent = new Intent();
73 intent.setClass(MainActivity.this,Exit.class);
74 startActivity(intent);
75 }
76 }
這種方法很簡單,要注意的是如果要想點擊其他地方使其隱藏,要在show設置四條屬性如下:
// 使其聚焦
mPopupWindow.setFocusable(true);
// 設置允許在外點擊消失
mPopupWindow.setOutsideTouchable(true);
//刷新狀態
mPopupWindow.update();
//點back鍵和其他地方使其消失,設置了這個才能觸發OnDismisslistener ,設置其他控件變化等操作
mPopupWindow.setBackgroundDrawable(new BitmapDrawable());
二、Activity做偽彈窗
本人感覺這個很先進啊。恕我冒犯,我只這里直接寫上牛人的代碼。此牛人寫的是防微信的demo。做的相當好,我在后面附上CSDN免費下載鏈接。
先貼上java代碼——Exit.java
1 package cn.buaa.myweixin;
2
3 import android.app.Activity;
4 import android.os.Bundle;
5 import android.view.MotionEvent;
6 import android.view.View;
7 import android.view.View.OnClickListener;
8 import android.widget.LinearLayout;
9 import android.widget.Toast;
10
11 public class Exit extends Activity {
12
13 private LinearLayout layout;
14 @Override
15 protected void onCreate(Bundle savedInstanceState) {
16 super.onCreate(savedInstanceState);
17 setContentView(R.layout.exit_dialog);
18 layout=(LinearLayout)findViewById(R.id.exit_layout);
19 layout.setOnClickListener(new OnClickListener() {
20
21 @Override
22 public void onClick(View v) {
23 // TODO Auto-generated method stub
24 Toast.makeText(getApplicationContext(), "提示:點擊窗口外部關閉窗口!",
25 Toast.LENGTH_SHORT).show();
26 }
27 });
28 }
29
30 @Override
31 public boolean onTouchEvent(MotionEvent event){
32 finish();
33 return true;
34 }
35
36 public void exitbutton1(View v) {
37 this.finish();
38 }
39 public void exitbutton0(View v) {
40 this.finish();
41 MainWeixin.instance.finish();//關閉Main 這個Activity
42 }
43 }
附上布局文件:exit_dialog.xml

1 <?xml version="1.0" encoding="UTF-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:id="@+id/exit_layout"
4 android:layout_width="280dp"
5 android:layout_height="wrap_content"
6 android:gravity="center_horizontal"
7 android:orientation="vertical"
8 android:background="@drawable/confirm_dialog_bg2" >
9
10 <TextView
11 android:layout_width="wrap_content"
12 android:layout_height="wrap_content"
13 android:layout_marginTop="4dp"
14 android:padding="5dp"
15 android:textColor="#333"
16 android:textSize="20sp"
17 android:text="退出微信" />
18
19 <TextView
20 android:layout_width="wrap_content"
21 android:layout_height="wrap_content"
22 android:textColor="#333"
23 android:layout_marginTop="1dp"
24 android:padding="10dp"
25 android:textSize="16sp"
26 android:gravity="center_horizontal"
27 android:text="退出后,你將收不到新的消\n息.確定要退出?" />
28
29
30 <LinearLayout
31 android:layout_width="wrap_content"
32 android:layout_height="wrap_content"
33 android:layout_marginTop="33dp"
34 android:layout_marginBottom="8dp"
35 >
36
37 <Button
38 android:id="@+id/exitBtn0"
39 android:layout_width="110dp"
40 android:layout_height="wrap_content"
41 android:text="是"
42 android:textSize="16sp"
43 android:textColor="#fff"
44 android:background="@drawable/btn_style_green"
45 android:gravity="center"
46 android:onClick="exitbutton0"
47 />
48
49 <Button
50 android:id="@+id/exitBtn1"
51 android:layout_width="110dp"
52 android:layout_height="wrap_content"
53 android:layout_marginLeft="10dp"
54 android:text="否"
55 android:textSize="16sp"
56 android:textColor="#333"
57 android:background="@drawable/btn_style_white"
58 android:gravity="center"
59 android:onClick="exitbutton1"
60 />
61 </LinearLayout>
62
63 </LinearLayout>
分析,彈出exit這個框很簡單,本身就是activity,在主界面用startavtivity等方法像普通activity啟動。
關鍵是如何做到點擊其他地方退出和如何關閉程序。
1、點擊其他地方退出,只要監聽OnClickListener讓所有的點擊都退出就行了(除了xml中指定按鈕事件之外)。
2、退出主程序。只要在出程序中將主程序自己設置成靜態對象,在外部調用即可 public static MainWeixin instance=null;
上面的布局和activity並不能將activity的窗體展現在主界面之上,看起來像個彈出框。下面是彈出框的styles配置:
1 <style name="MyDialogStyle">
2 <item name="android:windowBackground">@android:color/transparent</item>
3 <item name="android:windowFrame">@null</item>
4 <item name="android:windowNoTitle">true</item>
5 <item name="android:windowIsFloating">true</item>
6 <item name="android:windowIsTranslucent">true</item>
7 <item name="android:windowContentOverlay">@null</item>
8 <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
9 <item name="android:backgroundDimEnabled">true</item>
10 </style>
下面我們來分析一下這個布局的含義及重點:
重點1、<item name="android:windowBackground">@android:color/transparent</item>窗口背景色
重點2、<item name="android:windowFrame">@null</item>Dialog的windowFrame框為無
重點4、<item name="android:windowIsFloating">true</item>是否浮現在activity之上
重點5、<item name="android:windowIsTranslucent">true</item>窗口是否半透明——是(與第一條配合使用)
重點6、<item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>窗口彈出效果
重點7、<item name="android:backgroundDimEnabled">true</item> 是否允許背景模糊
重點8、<item name="android:windowContentOverlay">@null</item>這個不設置的話,可能會出現邊框黑線
以上代碼都是牛人們的功勞,我拿來做一分析,給更多需要的朋友。
我在眾多牛人的指引下一步步成長,感謝牛人們。
參考鏈接:
Dialog 頂部黑線問題
demo下載
buaa版防微信demo http://download.csdn.net/detail/win_xiang/4788158