android PopupWindow 和 Activity彈出窗口實現(xiàn)方式
更新時間:2012年11月20日 16:58:47 作者:
本人小菜一個。目前只見過兩種彈出框的實現(xiàn)方式,第一種是最常見的PopupWindow,第二種也就是Activity的方式是前幾天才見識過,需要的朋友可以參考下
本人小菜一個。目前只見過兩種彈出框的實現(xiàn)方式,第一種是最常見的PopupWindow,第二種也就是Activity的方式是前幾天才見識過。感覺很霸氣哦。沒想到,activity也可以做偽窗口。
先貼上最常見的方法,主要講activity的方法。
一、彈出PopupWindow

/**
* 彈出menu菜單
*/
public void menu_press(){
if(!menu_display){
//獲取LayoutInflater實例
inflater = (LayoutInflater)this.getSystemService(LAYOUT_INFLATER_SERVICE);
//這里的main布局是在inflate中加入的哦,以前都是直接this.setContentView()的吧?呵呵
//該方法返回的是一個View的對象,是布局中的根
layout = inflater.inflate(R.layout.main_menu, null);
//下面我們要考慮了,我怎樣將我的layout加入到PopupWindow中呢???很簡單
menuWindow = new PopupWindow(layout,LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); //后兩個參數(shù)是width和height
//menuWindow.showAsDropDown(layout); //設(shè)置彈出效果
//menuWindow.showAsDropDown(null, 0, layout.getHeight());
//設(shè)置如下四條信息,當(dāng)點擊其他區(qū)域使其隱藏,要在show之前配置
menuWindow.setFocusable(true);
menuWindow.setOutsideTouchable(true);
menuWindow.update();
menuWindow.setBackgroundDrawable(new BitmapDrawable());
mClose = (LinearLayout)layout.findViewById(R.id.menu_close);
menuWindow.showAtLocation(this.findViewById(R.id.schoolmain), Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL, 0,50); //設(shè)置layout在PopupWindow中顯示的位置
//如何獲取我們main中的控件呢?也很簡單
mMainbtn = (LinearLayout)layout.findViewById(R.id.menu_main_btn);
mHistorybtn = (LinearLayout) layout.findViewById(R.id.menu_history_btn);
mHelpbtn = (LinearLayout) layout.findViewById(R.id.menu_help_btn);
//下面對每一個Layout進(jìn)行單擊事件的注冊吧。。。
//比如單擊某個MenuItem的時候,他的背景色改變
//事先準(zhǔn)備好一些背景圖片或者顏色
mMainbtn.setOnClickListener (new View.OnClickListener() {
@Override
public void onClick(View arg0) {
mywebView.loadUrl(URL);
menuWindow.dismiss(); //響應(yīng)點擊事件之后關(guān)閉Menu
}
});
mHelpbtn.setOnClickListener (new View.OnClickListener() {
@Override
public void onClick(View arg0) {
mywebView.loadUrl(URL);
menuWindow.dismiss(); //響應(yīng)點擊事件
}
});
mHistorybtn.setOnClickListener (new View.OnClickListener() {
@Override
public void onClick(View arg0) {
mywebView.loadUrl(URL);
menuWindow.dismiss(); //響應(yīng)點擊事件
}
});
menu_display = true;
}else{
//如果當(dāng)前已經(jīng)為顯示狀態(tài),則隱藏起來
menuWindow.dismiss();
menu_display = false;
}
}
public void back_press(){
if(menu_display){ //如果 Menu已經(jīng)打開 ,先關(guān)閉Menu
menuWindow.dismiss();
menu_display = false;
}
else {
Intent intent = new Intent();
intent.setClass(MainActivity.this,Exit.class);
startActivity(intent);
}
}
這種方法很簡單,要注意的是如果要想點擊其他地方使其隱藏,要在show設(shè)置四條屬性如下:
// 使其聚焦
mPopupWindow.setFocusable(true);
// 設(shè)置允許在外點擊消失
mPopupWindow.setOutsideTouchable(true);
//刷新狀態(tài)
mPopupWindow.update();
//點back鍵和其他地方使其消失,設(shè)置了這個才能觸發(fā)OnDismisslistener ,設(shè)置其他控件變化等操作
mPopupWindow.setBackgroundDrawable(new BitmapDrawable());
二、Activity做偽彈窗
本人感覺這個很先進(jìn)啊。恕我冒犯,我只這里直接寫上牛人的代碼。此牛人寫的是防微信的demo。做的相當(dāng)好,我在后面附上CSDN免費下載鏈接。
先貼上java代碼——Exit.java
package cn.buaa.myweixin;
import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.LinearLayout;
import android.widget.Toast;
public class Exit extends Activity {
private LinearLayout layout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.exit_dialog);
layout=(LinearLayout)findViewById(R.id.exit_layout);
layout.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "提示:點擊窗口外部關(guān)閉窗口!",
Toast.LENGTH_SHORT).show();
}
});
}
@Override
public boolean onTouchEvent(MotionEvent event){
finish();
return true;
}
public void exitbutton1(View v) {
this.finish();
}
public void exitbutton0(View v) {
this.finish();
MainWeixin.instance.finish();//關(guān)閉Main 這個Activity
}
}
附上布局文件:exit_dialog.xml
View Code
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/exit_layout"
android:layout_width="280dp"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="vertical"
android:background="@drawable/confirm_dialog_bg2" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:padding="5dp"
android:textColor="#333"
android:textSize="20sp"
android:text="退出微信" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#333"
android:layout_marginTop="1dp"
android:padding="10dp"
android:textSize="16sp"
android:gravity="center_horizontal"
android:text="退出后,你將收不到新的消\n息.確定要退出?" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="33dp"
android:layout_marginBottom="8dp"
>
<Button
android:id="@+id/exitBtn0"
android:layout_width="110dp"
android:layout_height="wrap_content"
android:text="是"
android:textSize="16sp"
android:textColor="#fff"
android:background="@drawable/btn_style_green"
android:gravity="center"
android:onClick="exitbutton0"
/>
<Button
android:id="@+id/exitBtn1"
android:layout_width="110dp"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text="否"
android:textSize="16sp"
android:textColor="#333"
android:background="@drawable/btn_style_white"
android:gravity="center"
android:onClick="exitbutton1"
/>
</LinearLayout>
</LinearLayout>
分析,彈出exit這個框很簡單,本身就是activity,在主界面用startavtivity等方法像普通activity啟動。
關(guān)鍵是如何做到點擊其他地方退出和如何關(guān)閉程序。
、點擊其他地方退出,只要監(jiān)聽OnClickListener讓所有的點擊都退出就行了(除了xml中指定按鈕事件之外)。
、退出主程序。只要在出程序中將主程序自己設(shè)置成靜態(tài)對象,在外部調(diào)用即可 public static MainWeixin instance=null;
上面的布局和activity并不能將activity的窗體展現(xiàn)在主界面之上,看起來像個彈出框。下面是彈出框的styles配置:
<style name="MyDialogStyle">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowFrame">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
<item name="android:backgroundDimEnabled">true</item>
</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>是否浮現(xiàn)在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>這個不設(shè)置的話,可能會出現(xiàn)邊框黑線
以上代碼都是牛人們的功勞,我拿來做一分析,給更多需要的朋友。
我在眾多牛人的指引下一步步成長,感謝牛人們。
先貼上最常見的方法,主要講activity的方法。
一、彈出PopupWindow

復(fù)制代碼 代碼如下:
/**
* 彈出menu菜單
*/
public void menu_press(){
if(!menu_display){
//獲取LayoutInflater實例
inflater = (LayoutInflater)this.getSystemService(LAYOUT_INFLATER_SERVICE);
//這里的main布局是在inflate中加入的哦,以前都是直接this.setContentView()的吧?呵呵
//該方法返回的是一個View的對象,是布局中的根
layout = inflater.inflate(R.layout.main_menu, null);
//下面我們要考慮了,我怎樣將我的layout加入到PopupWindow中呢???很簡單
menuWindow = new PopupWindow(layout,LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); //后兩個參數(shù)是width和height
//menuWindow.showAsDropDown(layout); //設(shè)置彈出效果
//menuWindow.showAsDropDown(null, 0, layout.getHeight());
//設(shè)置如下四條信息,當(dāng)點擊其他區(qū)域使其隱藏,要在show之前配置
menuWindow.setFocusable(true);
menuWindow.setOutsideTouchable(true);
menuWindow.update();
menuWindow.setBackgroundDrawable(new BitmapDrawable());
mClose = (LinearLayout)layout.findViewById(R.id.menu_close);
menuWindow.showAtLocation(this.findViewById(R.id.schoolmain), Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL, 0,50); //設(shè)置layout在PopupWindow中顯示的位置
//如何獲取我們main中的控件呢?也很簡單
mMainbtn = (LinearLayout)layout.findViewById(R.id.menu_main_btn);
mHistorybtn = (LinearLayout) layout.findViewById(R.id.menu_history_btn);
mHelpbtn = (LinearLayout) layout.findViewById(R.id.menu_help_btn);
//下面對每一個Layout進(jìn)行單擊事件的注冊吧。。。
//比如單擊某個MenuItem的時候,他的背景色改變
//事先準(zhǔn)備好一些背景圖片或者顏色
mMainbtn.setOnClickListener (new View.OnClickListener() {
@Override
public void onClick(View arg0) {
mywebView.loadUrl(URL);
menuWindow.dismiss(); //響應(yīng)點擊事件之后關(guān)閉Menu
}
});
mHelpbtn.setOnClickListener (new View.OnClickListener() {
@Override
public void onClick(View arg0) {
mywebView.loadUrl(URL);
menuWindow.dismiss(); //響應(yīng)點擊事件
}
});
mHistorybtn.setOnClickListener (new View.OnClickListener() {
@Override
public void onClick(View arg0) {
mywebView.loadUrl(URL);
menuWindow.dismiss(); //響應(yīng)點擊事件
}
});
menu_display = true;
}else{
//如果當(dāng)前已經(jīng)為顯示狀態(tài),則隱藏起來
menuWindow.dismiss();
menu_display = false;
}
}
public void back_press(){
if(menu_display){ //如果 Menu已經(jīng)打開 ,先關(guān)閉Menu
menuWindow.dismiss();
menu_display = false;
}
else {
Intent intent = new Intent();
intent.setClass(MainActivity.this,Exit.class);
startActivity(intent);
}
}
這種方法很簡單,要注意的是如果要想點擊其他地方使其隱藏,要在show設(shè)置四條屬性如下:
// 使其聚焦
mPopupWindow.setFocusable(true);
// 設(shè)置允許在外點擊消失
mPopupWindow.setOutsideTouchable(true);
//刷新狀態(tài)
mPopupWindow.update();
//點back鍵和其他地方使其消失,設(shè)置了這個才能觸發(fā)OnDismisslistener ,設(shè)置其他控件變化等操作
mPopupWindow.setBackgroundDrawable(new BitmapDrawable());
二、Activity做偽彈窗

本人感覺這個很先進(jìn)啊。恕我冒犯,我只這里直接寫上牛人的代碼。此牛人寫的是防微信的demo。做的相當(dāng)好,我在后面附上CSDN免費下載鏈接。
先貼上java代碼——Exit.java
package cn.buaa.myweixin;
import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.LinearLayout;
import android.widget.Toast;
public class Exit extends Activity {
private LinearLayout layout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.exit_dialog);
layout=(LinearLayout)findViewById(R.id.exit_layout);
layout.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "提示:點擊窗口外部關(guān)閉窗口!",
Toast.LENGTH_SHORT).show();
}
});
}
@Override
public boolean onTouchEvent(MotionEvent event){
finish();
return true;
}
public void exitbutton1(View v) {
this.finish();
}
public void exitbutton0(View v) {
this.finish();
MainWeixin.instance.finish();//關(guān)閉Main 這個Activity
}
}
附上布局文件:exit_dialog.xml
復(fù)制代碼 代碼如下:
View Code
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/exit_layout"
android:layout_width="280dp"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="vertical"
android:background="@drawable/confirm_dialog_bg2" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:padding="5dp"
android:textColor="#333"
android:textSize="20sp"
android:text="退出微信" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#333"
android:layout_marginTop="1dp"
android:padding="10dp"
android:textSize="16sp"
android:gravity="center_horizontal"
android:text="退出后,你將收不到新的消\n息.確定要退出?" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="33dp"
android:layout_marginBottom="8dp"
>
<Button
android:id="@+id/exitBtn0"
android:layout_width="110dp"
android:layout_height="wrap_content"
android:text="是"
android:textSize="16sp"
android:textColor="#fff"
android:background="@drawable/btn_style_green"
android:gravity="center"
android:onClick="exitbutton0"
/>
<Button
android:id="@+id/exitBtn1"
android:layout_width="110dp"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text="否"
android:textSize="16sp"
android:textColor="#333"
android:background="@drawable/btn_style_white"
android:gravity="center"
android:onClick="exitbutton1"
/>
</LinearLayout>
</LinearLayout>
分析,彈出exit這個框很簡單,本身就是activity,在主界面用startavtivity等方法像普通activity啟動。
關(guān)鍵是如何做到點擊其他地方退出和如何關(guān)閉程序。
、點擊其他地方退出,只要監(jiān)聽OnClickListener讓所有的點擊都退出就行了(除了xml中指定按鈕事件之外)。
、退出主程序。只要在出程序中將主程序自己設(shè)置成靜態(tài)對象,在外部調(diào)用即可 public static MainWeixin instance=null;
上面的布局和activity并不能將activity的窗體展現(xiàn)在主界面之上,看起來像個彈出框。下面是彈出框的styles配置:
復(fù)制代碼 代碼如下:
<style name="MyDialogStyle">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowFrame">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
<item name="android:backgroundDimEnabled">true</item>
</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>是否浮現(xiàn)在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>這個不設(shè)置的話,可能會出現(xiàn)邊框黑線
以上代碼都是牛人們的功勞,我拿來做一分析,給更多需要的朋友。
我在眾多牛人的指引下一步步成長,感謝牛人們。
您可能感興趣的文章:
- Android開發(fā)之PopupWindow實現(xiàn)彈窗效果
- Android彈窗ListPopupWindow的簡單應(yīng)用詳解
- Android使用 PopupWindow 實現(xiàn)底部彈窗功能
- Android PopupWindow實現(xiàn)左側(cè)彈窗效果
- Android開發(fā)實現(xiàn)popupWindow彈出窗口自定義布局與位置控制方法
- Android Popupwindow彈出窗口的簡單使用方法
- Android編程實現(xiàn)的自定義彈窗(PopupWindow)功能示例
- Android自定義彈出窗口PopupWindow使用技巧
- Android控件PopupWindow模仿ios底部彈窗
- Android中PopupWindow彈出式窗口使用方法詳解
相關(guān)文章
Android Surfaceview的繪制與應(yīng)用
這篇文章主要介紹了Android Surfaceview的繪制與應(yīng)用的相關(guān)資料,需要的朋友可以參考下2017-07-07android 指紋識別調(diào)用實現(xiàn)方法及示例代碼
這里主要介紹Android 指紋識別的簡單實現(xiàn)代碼,希望能幫助開發(fā)這部分應(yīng)用的朋友,有需要的小伙伴可以參考下2016-09-09Android實現(xiàn)便于批量操作可多選的圖片ListView實例
這篇文章主要介紹了Android實現(xiàn)便于批量操作可多選的圖片ListView功能實現(xiàn)方法,涉及ListView針對多圖操作的相關(guān)技巧,需要的朋友可以參考下2016-08-08Android基于OkHttp實現(xiàn)下載和上傳圖片
這篇文章主要為大家詳細(xì)介紹了Android基于OkHttp實現(xiàn)下載和上傳圖片功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-11-11android自動生成dimens適配文件的圖文教程詳解(無需Java工具類)
這篇文章主要介紹了android自動生成dimens適配文件,無需Java工具類,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-03Android12四大組件之Activity生命周期變化詳解
雖然說我們天天都在使用Activity,但是你真的對Activity的生命機(jī)制完全了解了嗎?Activity的生命周期方法只有七個,但是其實那只是默認(rèn)的情況。也就是說在其他情況下,Activity的生命周期可能不會是按照我們以前所知道的流程,本章著重講解Activity的生命周期變化2022-07-07