淺析Android中常見三種彈框在項(xiàng)目中的應(yīng)用
一丶概述
彈框在Android項(xiàng)目中經(jīng)常出現(xiàn),常見的實(shí)現(xiàn)方法有三種:Dialog 彈框,Window彈框,Activity偽彈框。本文就說一說三種彈框的實(shí)現(xiàn)及在項(xiàng)目中的運(yùn)用。
二丶演示圖

圖一為常見的三種彈框(文末上鏈接),圖二為項(xiàng)目中用到的Activity偽彈框
三丶正文
1.Dialog彈框
先看一篇一篇文章:
android 8種對話框(Dialog)使用方法匯總
Dialog是系統(tǒng)自帶的彈框,然而常常因?yàn)閁I不好看而遭嫌棄,常需要自定義
public class MyDialog extends Dialog implements android.view.View.OnClickListener {
private Context mContext;
private String mTitle;
private String mDetail;
private TextView mTextTitle;
private TextView mTextDetail;
private TextView mButtonYes;
private TextView mButtonNo;
private onClickInterface mOnclClickInterface;
public MyDialog(Context context, String title, String detail) {
super(context, R.style.MyDialogStyle);
this.mContext = context;
this.mTitle = title;
this.mDetail = detail;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
initView();
}
private void initView() {
LayoutInflater inflater = LayoutInflater.from(mContext);
View view = inflater.inflate(R.layout.layout_dialog, null);
setContentView(view);
mButtonYes = (TextView) view.findViewById(R.id.dialog_yes);
mButtonNo = (TextView) view.findViewById(R.id.dialog_no);
mTextTitle = (TextView) view.findViewById(R.id.dialog_title);
mTextDetail = (TextView) view.findViewById(R.id.dialog_detail);
mTextTitle.setText(mTitle);
mTextDetail.setText(mDetail);
mButtonYes.setOnClickListener(this);
mButtonNo.setOnClickListener(this);
}
public interface onClickInterface {
public void clickYes();
public void clickNo();
}
public void setOnClickInterface(onClickInterface onclClickInterface) {
this.mOnclClickInterface = onclClickInterface;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.dialog_yes:
mOnclClickInterface.clickYes();
break;
case R.id.dialog_no:
mOnclClickInterface.clickNo();
break;
default:
break;
}
}
}
這里就是:1.綁定布局 2.設(shè)置監(jiān)聽,監(jiān)聽接口
主要說一下布局里的stytle(懸浮在Activity上,模糊顯示就是在這里控制)
<style name="MyDialogStyle"> <item name="android:windowBackground">@android:color/transparent</item> <!--設(shè)置dialog的背景--> <item name="android:windowFrame">@null</item> <!--Dialog的windowFrame框?yàn)闊o--> <item name="android:windowNoTitle">true</item> <!--是否有title--> <item name="android:windowIsFloating">true</item> <!--是否浮現(xiàn)在activity之上--> <item name="android:windowIsTranslucent">false</item> <!--是否半透明--> <item name="android:windowContentOverlay">@null</item> <!--對話框是否有遮蓋,這個(gè)不設(shè)置的話,可能會(huì)出現(xiàn)邊框黑線--> <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item> <!--動(dòng)畫--> <item name="android:backgroundDimEnabled">true</item> <!-- 背景是否模糊顯示--> </style>
Dialog彈框一般用于,網(wǎng)絡(luò)數(shù)據(jù)加載顯示,或交互較少的彈框(基本被新下拉刷新控件SwipeRefreshLayout替代)
2.Window彈框
public class MyWindow {
private Context mContext;
private WindowManager mwinWindowManager;
private View mView;
private static boolean isShow = false;
public MyWindow(Context context) {
mContext = context.getApplicationContext();
}
public void showMyWindow() {
if (isShow) {
return;
}
mwinWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
//設(shè)置WindowManager.LayoutParams的屬性
WindowManager.LayoutParams params = new WindowManager.LayoutParams();
//類型
params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
//flags
//如果設(shè)置了WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,彈出的View沒焦點(diǎn),收不到Back鍵的事件
//當(dāng)按Back、Home鍵時(shí),背景應(yīng)用退出,彈出的view就可以懸浮在桌面了。
params.flags = WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
params.format = PixelFormat.TRANSLUCENT;
params.width = LayoutParams.MATCH_PARENT;
params.height = LayoutParams.MATCH_PARENT;
params.gravity = Gravity.CENTER;
//初始化View
mView = initView(mContext);
//點(diǎn)擊back鍵,關(guān)閉window
mView.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
Log.d("wxx", "onKey");
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
Log.d("wxx", "onKey BACK");
hideMyWindow();
return true;
default:
return false;
}
}
});
mwinWindowManager.addView(mView, params);
isShow = true;
}
private View initView(Context context) {
LayoutInflater inflater = LayoutInflater.from(context);
View view = inflater.inflate(R.layout.layout_window, null);
Button btnYes = (Button) view.findViewById(R.id.window_yes);
btnYes.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(mContext, "Window yes!", Toast.LENGTH_LONG).show();
hideMyWindow();
}
});
Button btnNO = (Button) view.findViewById(R.id.window_no);
btnNO.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(mContext, "Window No!", Toast.LENGTH_LONG).show();
hideMyWindow();
}
});
//點(diǎn)擊window窗口外圍,關(guān)閉window
final View wView = view.findViewById(R.id.view_layout);
view.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int x = (int) event.getX();
int y = (int) event.getY();
Rect rect = new Rect();
wView.getGlobalVisibleRect(rect);
if (!rect.contains(x, y)) {
hideMyWindow();
}
return false;
}
});
return view;
}
public void hideMyWindow() {
if (isShow && mView != null) {
mwinWindowManager.removeView(mView);
isShow = false;
}
}
}
這個(gè)就厲害了,展現(xiàn),隱藏,點(diǎn)擊監(jiān)聽都是自己寫的方法,原來點(diǎn)擊窗口外關(guān)閉窗口是這樣實(shí)現(xiàn)的,是不是又學(xué)到了
然后是關(guān)于:
android Window WindowManager 整理
主要用于自定義控件,比如說下拉框:
自定義spinner下拉框
3.Activity偽彈框
public class MyActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_activity);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
this.finish();
return true;
}
public void YesButton(View v) {
this.finish();
Toast.makeText(getApplicationContext(), "Yes, Hunman is Activity", Toast.LENGTH_LONG).show();
}
public void NoButton(View v) {
this.finish();
Toast.makeText(getApplicationContext(), "No, Hunman is not Activity", Toast.LENGTH_LONG).show();
}
}
簡單得不能再簡單,跳轉(zhuǎn)跳轉(zhuǎn)到另一個(gè)Activity
注意點(diǎn)Activity主題(控制Activity為彈框樣式):
<activity android:name="com.wuxianxi.hunman.smallwindows.MyActivity" android:theme="@style/MyActivityStyle" > </activity> <style name="MyActivityStyle"> <item name="android:windowBackground">@android:color/transparent</item> <!--設(shè)置dialog的背景--> <item name="android:windowFrame">@null</item> <!--Dialog的windowFrame框?yàn)闊o--> <item name="android:windowNoTitle">true</item> <!--是否有title--> <item name="android:windowIsFloating">true</item> <!--是否浮現(xiàn)在activity之上--> <item name="android:windowIsTranslucent">true</item> <!--是否半透明--> <item name="android:windowContentOverlay">@null</item> <!--對話框是否有遮蓋,這個(gè)不設(shè)置的話,可能會(huì)出現(xiàn)邊框黑線--> <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item> <!--動(dòng)畫--> <item name="android:backgroundDimEnabled">true</item> <!-- 背景是否模糊顯示--> </style>
Activity偽彈框最常用,用于交互,操作較復(fù)雜的彈框,如圖二
補(bǔ)充這里可通過方法控制Activity彈框?qū)挶?/p>
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/** 設(shè)置寬度為屏幕的0.9*/
WindowManager windowManager = getWindowManager();
/* 獲取屏幕寬、高 */
Display display = windowManager.getDefaultDisplay();
/* 獲取對話框當(dāng)前的參數(shù)值 */
WindowManager.LayoutParams p = getWindow().getAttributes();
/* 寬度設(shè)置為屏幕的0.9 */
p.width = (int) (display.getWidth() * 0.9);
/* 設(shè)置透明度,0.0為完全透明,1.0為完全不透明 */
p.alpha = 0.95f;
/* 設(shè)置布局參數(shù) */
getWindow().setAttributes(p);
// getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT,
// ViewGroup.LayoutParams.WRAP_CONTENT);
/* 設(shè)置點(diǎn)擊彈框外部不可消失 */
setFinishOnTouchOutside(false);
}
最后貼上MainActivity
public class MainActivity extends ActionBarActivity implements OnClickListener {
private Button btnWindow;
private Button btnDialog;
private Button btnActivity;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
btnWindow = (Button) findViewById(R.id.btn_window);
btnDialog = (Button) findViewById(R.id.btn_dialog);
btnActivity = (Button) findViewById(R.id.btn_activity);
btnWindow.setOnClickListener(this);
btnDialog.setOnClickListener(this);
btnActivity.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_window:
MyWindow myWindow = new MyWindow(this);
myWindow.showMyWindow();
break;
case R.id.btn_dialog:
//注意下面第一個(gè)參數(shù)不能為getApplicationContext(),而應(yīng)該是Activity, 因?yàn)檗k有activity才能添加窗口
final MyDialog dialog = new MyDialog(MainActivity.this, "Hunman - Dialog", "Hunman is a Dialog\nYes or No!");
dialog.show();
dialog.setOnClickInterface(new MyDialog.onClickInterface() {
@Override
public void clickYes() {
dialog.dismiss();
Toast.makeText(getApplicationContext(), "Yes, Hunman is Dialog", Toast.LENGTH_LONG).show();
}
@Override
public void clickNo() {
dialog.dismiss();
Toast.makeText(getApplicationContext(), "Yes, Hunman is not Dialog", Toast.LENGTH_LONG).show();
}
});
break;
case R.id.btn_activity:
Intent intent3 = new Intent(MainActivity.this, MyActivity.class);
startActivity(intent3);
break;
default:
break;
}
}
}
代碼下載地址:https://github.com/BabyWu/SmallWindows
以上所述是小編給大家介紹的淺析Android中常見三種彈框在項(xiàng)目中的應(yīng)用,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
- Android高德地圖marker自定義彈框窗口
- Android自定義彈框樣式
- Android啟動(dòng)頁用戶相關(guān)政策彈框的實(shí)現(xiàn)代碼
- Android 實(shí)現(xiàn)抖音頭像底部彈框效果的實(shí)例代碼
- Android中 TeaScreenPopupWindow多類型篩選彈框功能的實(shí)例代碼
- android自定義Dialog彈框和背景陰影顯示效果
- Android 提交或者上傳數(shù)據(jù)時(shí)的dialog彈框動(dòng)畫效果
- Android簡單實(shí)現(xiàn)自定義彈框(PopupWindow)
- Android填坑系列:在小米系列等機(jī)型上放開定位權(quán)限后的定位請求彈框示例
- Android自定義彈框Dialog效果
相關(guān)文章
Android EasyPermissions官方庫高效處理權(quán)限相關(guān)教程
Easypermissions簡化了Android M的運(yùn)行時(shí)權(quán)限的申請、結(jié)果處理、判斷等步驟。這篇文章主要介紹了Android EasyPermissions官方庫高效處理權(quán)限相關(guān)教程,需要的朋友可以參考下2017-11-11
Android TreeView實(shí)現(xiàn)帶復(fù)選框樹形組織結(jié)構(gòu)
這篇文章主要為大家詳細(xì)介紹了Android TreeView實(shí)現(xiàn)帶復(fù)選框樹形組織結(jié)構(gòu),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07
Android框架Volley使用:ImageRequest請求實(shí)現(xiàn)圖片加載
這篇文章主要介紹了Android框架Volley使用:ImageRequest請求實(shí)現(xiàn)圖片加載的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-05-05
Android仿QQ空間動(dòng)態(tài)界面分享功能
這篇文章主要介紹了Android仿QQ空間動(dòng)態(tài)界面分享功能,本文圖文并茂給大家介紹的非常詳細(xì),需要的朋友可以參考下2017-04-04
Android實(shí)現(xiàn)拍照截取和相冊圖片截取
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)拍照截取和相冊獲取圖片截取,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12
Android視頻/音頻緩存框架AndroidVideoCache(Okhttp)詳解
這篇文章主要為大家詳細(xì)介紹了Android視頻、音頻緩存框架AndroidVideoCache,實(shí)現(xiàn)邊下邊播功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
Android ListView實(shí)現(xiàn)ImageLoader圖片加載的方法
這篇文章主要介紹了Android ListView實(shí)現(xiàn)ImageLoader圖片加載的方法,結(jié)合實(shí)例形式簡單分析了開源框架Imageloader的功能、使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-07-07
Android實(shí)戰(zhàn)打飛機(jī)游戲之無限循環(huán)的背景圖(2)
這篇文章主要為大家詳細(xì)介紹了Android實(shí)戰(zhàn)打飛機(jī)游戲之無限循環(huán)的背景圖,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-07-07

