淺析Android中常見三種彈框在項目中的應(yīng)用
一丶概述
彈框在Android項目中經(jīng)常出現(xiàn),常見的實(shí)現(xiàn)方法有三種:Dialog 彈框,Window彈框,Activity偽彈框。本文就說一說三種彈框的實(shí)現(xiàn)及在項目中的運(yùn)用。
二丶演示圖
圖一為常見的三種彈框(文末上鏈接),圖二為項目中用到的Activity偽彈框
三丶正文
1.Dialog彈框
先看一篇一篇文章:
android 8種對話框(Dialog)使用方法匯總
Dialog是系統(tǒng)自帶的彈框,然而常常因為UI不好看而遭嫌棄,常需要自定義
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框為無--> <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> <!--對話框是否有遮蓋,這個不設(shè)置的話,可能會出現(xiàn)邊框黑線--> <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item> <!--動畫--> <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鍵時,背景應(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; } } }
這個就厲害了,展現(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)到另一個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框為無--> <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> <!--對話框是否有遮蓋,這個不設(shè)置的話,可能會出現(xiàn)邊框黑線--> <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item> <!--動畫--> <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: //注意下面第一個參數(shù)不能為getApplicationContext(),而應(yīng)該是Activity, 因為辦有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中常見三種彈框在項目中的應(yīng)用,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
- Android高德地圖marker自定義彈框窗口
- Android自定義彈框樣式
- Android啟動頁用戶相關(guān)政策彈框的實(shí)現(xiàn)代碼
- Android 實(shí)現(xiàn)抖音頭像底部彈框效果的實(shí)例代碼
- Android中 TeaScreenPopupWindow多類型篩選彈框功能的實(shí)例代碼
- android自定義Dialog彈框和背景陰影顯示效果
- Android 提交或者上傳數(shù)據(jù)時的dialog彈框動畫效果
- Android簡單實(shí)現(xiàn)自定義彈框(PopupWindow)
- Android填坑系列:在小米系列等機(jī)型上放開定位權(quán)限后的定位請求彈框示例
- Android自定義彈框Dialog效果
相關(guān)文章
Android下拉列表(Spinner)效果(使用C#和Java分別實(shí)現(xiàn))
這篇文章主要介紹了Android下拉列表(Spinner)效果(使用C#和Java分別實(shí)現(xiàn)),本文直接給出效果圖和兩種語言的實(shí)現(xiàn)代碼及布局代碼,需要的朋友可以參考下2015-06-06Android ViewPager無限循環(huán)實(shí)現(xiàn)底部小圓點(diǎn)動態(tài)滑動
這篇文章主要為大家詳細(xì)介紹了Android ViewPager無限循環(huán)實(shí)現(xiàn)底部小圓點(diǎn)動態(tài)滑動的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-03-03根據(jù)USER-AGENT判斷手機(jī)類型并跳轉(zhuǎn)到相應(yīng)的app下載頁面
檢測瀏覽器的USER-AGENT,然后根據(jù)正則表達(dá)式來確定客戶端類型,并跳轉(zhuǎn)到相應(yīng)的app下載頁面,這個方法還是比較實(shí)用的,大家可以看看2014-09-09Android內(nèi)存優(yōu)化操作方法梳理總結(jié)
這篇文章主要介紹了Android 內(nèi)存優(yōu)化知識點(diǎn)梳理總結(jié),Android 操作系統(tǒng)給每個進(jìn)程都會分配指定額度的內(nèi)存空間,App 使用內(nèi)存來進(jìn)行快速的文件訪問交互,長時間如此便需要優(yōu)化策略,文章分享優(yōu)化知識點(diǎn)總結(jié),需要的朋友可以參考一下2022-11-11android?studio實(shí)現(xiàn)簡單的計算器小功能
這篇文章主要為大家詳細(xì)介紹了android?studio實(shí)現(xiàn)簡單的計算器小功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-05-05Android中Fragment的基本用法示例總結(jié)
Fragment是activity的界面中的一部分或一種行為,下面這篇文章主要給大家介紹了關(guān)于Android中Fragment的基本用法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2018-05-05Android開發(fā)調(diào)用WebService的方法示例
這篇文章主要介紹了Android開發(fā)調(diào)用WebService的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Android調(diào)用WebService的原理、實(shí)現(xiàn)方法與相關(guān)操作注意事項,需要的朋友可以參考下2017-10-10Android listView 繪制表格實(shí)例詳解
這篇文章主要介紹了Android listView 繪制表格實(shí)例詳解的相關(guān)資料,這里附有實(shí)例代碼及實(shí)現(xiàn)效果圖,利用listView 繪制表格提供實(shí)現(xiàn)思路,需要的朋友可以參考下2017-01-01Android實(shí)現(xiàn)圖片的高斯模糊(兩種方式)
本文給大家分享兩種實(shí)現(xiàn)圖片的高斯模糊效果,非常不錯,具有參考借鑒價值,對android圖片高斯模糊效果感興趣的朋友一起看看吧2017-03-03