1. 程式人生 > >Android 常見三種彈框 在專案中的運用

Android 常見三種彈框 在專案中的運用

一丶概述

彈框在Android專案中經常出現,常見的實現方法有三種:Dialog 彈框,Window彈框,Activity偽彈框。本文就說一說三種彈框的實現及在專案中的運用。

二丶演示圖

       

圖一為常見的三種彈框(文末上鍊接),圖二為專案中用到的Activity偽彈框

三丶正文

1.Dialog彈框

先看一篇一篇文章:

Dialog是系統自帶的彈框,然而常常因為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.設定監聽,監聽介面 主要說一下佈局裡的stytle(懸浮在Activity上,模糊顯示就是在這裡控制)
<style name="MyDialogStyle">
    <item name="android:windowBackground">@android:color/transparent</item> <!--設定dialog的背景-->
<item name="android:windowFrame">@null</item> <!--Dialog的windowFrame框為無-->
<item name="android:windowNoTitle">true</item> <!--是否有title-->
<item name="android:windowIsFloating">true</item> <!--是否浮現在activity之上-->
<item name="android:windowIsTranslucent">false</item> <!--是否半透明-->
<item name="android:windowContentOverlay">@null</item> <!--對話方塊是否有遮蓋,這個不設定的話,可能會出現邊框黑線-->
<item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item> <!--動畫-->
<item name="android:backgroundDimEnabled">true</item> <!-- 背景是否模糊顯示-->
</style>

Dialog彈框一般用於,網路資料載入顯示,或互動較少的彈框(基本被新下拉重新整理控制元件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);
//設定WindowManager.LayoutParams的屬性
WindowManager.LayoutParams params = new WindowManager.LayoutParams();
//型別
params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
//flags
      //如果設定了WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,彈出的View沒焦點,收不到Back鍵的事件
      //當按Back、Home鍵時,背景應用退出,彈出的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);
//點選back鍵,關閉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();
}
      });       
//點選window視窗外圍,關閉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;
}
   }
}

這個就厲害了,展現,隱藏,點選監聽都是自己寫的方法,原來點選視窗外關閉視窗是這樣實現的,是不是又學到了

然後是關於:

主要用於自定義控制元件,比如說下拉框:

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();
}
}

簡單得不能再簡單,跳轉跳轉到另一個Activity

注意點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> <!--設定dialog的背景-->
<item name="android:windowFrame">@null</item> <!--Dialog的windowFrame框為無-->
<item name="android:windowNoTitle">true</item> <!--是否有title-->
<item name="android:windowIsFloating">true</item> <!--是否浮現在activity之上-->
<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>
Activity偽彈框最常用,用於互動,操作較複雜的彈框,如圖二

補充這裡可通過方法控制Activity彈框寬比

  @Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
/** 設定寬度為螢幕的0.9*/
WindowManager windowManager = getWindowManager();
/* 獲取螢幕寬、高 */
Display display = windowManager.getDefaultDisplay();
/* 獲取對話方塊當前的引數值 */
WindowManager.LayoutParams p = getWindow().getAttributes();
/* 寬度設定為螢幕的0.9 */
p.width = (int) (display.getWidth() * 0.9);
/* 設定透明度,0.0為完全透明,1.0為完全不透明 */
p.alpha = 0.95f;
/* 設定佈局引數 */
getWindow().setAttributes(p);
//        getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT,
//                ViewGroup.LayoutParams.WRAP_CONTENT);
        /* 設定點選彈框外部不可消失 */
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:
         //注意下面第一個引數不能為getApplicationContext(),而應該是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;
}
   }
}

相關推薦

Android 常見專案運用

一丶概述 彈框在Android專案中經常出現,常見的實現方法有三種:Dialog 彈框,Window彈框,Activity偽彈框。本文就說一說三種彈框的實現及在專案中的運用。 二丶演示圖         圖一為常見的三種彈框(文末上鍊接),圖二為專案中用到的Activi

ios

目前為止,已經知道3種IOS彈框: 1、系統彈框-底部彈框 UIActionSheet  (1)用法:處理使用者非常危險的操作,比如登出系統等 (2)舉例: UIActionSheet *sheet = [[UIActionSheet alloc] initWit

angular2下的(toaster sweetAlert modal) 及 特性模塊間的依賴關系

idt pri show type tab eba 變量 center 目的 三種彈框: 說明:下表僅作技術選擇的參考,紅色部分是容易出錯的,或者難點。 toaster sweetAlert modal package.json依賴 "angular2-toa

JS瀏覽器的

意見 基礎上 pro 基礎 模態 string 空字符 lin als 1.alert:使用alert彈框提示信息,最後都會被轉化為字符串輸出(因為調用了toString這個方法)。比如alert(1+1)彈出的結果應該是字符串形式的“2”。 2.Confirm:在aler

javascript 出對話

ont 出現 進入 span 執行 confirm 輸入 str strong 第一種:alert()方法 第二種:confirm()方法 返回一個布爾值,根據返回的值可以執行相應操作。 第三種: prompt()方法 返回輸入的消息,或者其默認值提示框經常用於提示用戶在進

JavaScript出對話方塊

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

JS(alert、confirm、prompt)

<script> alert('hello');//彈框① 沒有返回值,返回undefined confirm("彈框②");//返回值為布林型別:true、false prompt("這是彈框③嗎?","是的");//帶輸入框的彈窗 </script>

javascript出瀏覽器的提示:提示資訊、確認、輸入文字

瀏覽器的三種提示框: alert()提示資訊框 confirm()提示確認框 prompt()提示輸入文字框 1、alert()提示資訊框 效果: 實現程式碼:

Android的幾

appcompat eight err alert utf 最大值 ket 1.0 創建 項目效果圖: 新建一個項目,結構圖如下所示: activity_main.xml: <?xml version="1.0" encoding="

Js出式訊息提醒的命令是什麼?(警告,確認,資訊輸入)

1、警告框alert,在js中直接運用alert("警告");2、確認框confirm。confirm() 方法用於顯示一個帶有指定訊息和 OK 及取消按鈕的對話方塊,根據使用者點選確認框上的按鈕返回t

可以在 JavaScript 建立訊息:警告、確認、提示

提示框 <html> <head> <script type="text/javascript"> function disp_prompt()   {   var name=prompt("請輸入您的名字","Bill Gates")   if (name!=null

JavaScript出式訊息提醒的命令是什麼?(如:警告,確認,資訊輸入)

1、警告框alert,在js中直接運用alert("警告"); 2、確認框confirm。 confirm() 方法用於顯示一個帶有指定訊息和 OK 及取消按鈕的對話方塊,根據使用者點選確認框上的按鈕返回true與false。 用法: if(confirm("確定要清空資料

js的方式

http://www.jb51.net/article/81376.htm 學習過js的小夥伴會發現,我們在一些例項中用到了alert()方法、prompt()方法、prompt()方法,他們都是在螢幕上彈出一個對話方塊,並且在上面顯示括號內的內容,使用這種方法使得

JavaScript的對話是通過調用window對象的個方法alert(),confirm()和prompt()

使用 運行 clas 都是 class 結果 腳本 但是 files 第一種:alert()方法 alert()方法是這三種對話框中最容易使用的一種,她可以用來簡單而明了地將alert()括號內的文本信息顯示在對話框中,我們將它稱為警示對話框,要顯示的信息放置在括號內,該對

常見存儲方式DAS、NAS、SAN的架構及比較

DAS NAS SAN存儲的分類 根據服務器類型分為: 封閉系統的存儲(封閉系統主要指大型機) 開放系統的存儲(開放系統指基於window Unix Linux等操作系統的服務器) 開放系統的存儲分為:內置存儲和外掛存儲 外掛存儲根據連接方式分為:直連式存儲(DAS)和網絡化存儲(FAS);網絡化存儲根

使用方式定位html的元素

使用三種方式定位html中的元素1)使用三種方式定位html中的元素a)通過ID$("#ID")b)通過標簽名$("標簽名")c)通過樣式名$(".樣式名")2)dom中,需要判段查找到的元素是否為null,而jquery中,無需判段,因為jquer

夏天必備!筆記本常見降溫方法

不下來 優化 image block alt ima 效果 臺式機 筆記本電腦   由於筆記本“便攜性”和“高性能”的特點,筆記本的內部空間越來越小,但硬盤、CPU和其他的組件在運行過程中產生大量的熱量。筆記本CPU運行頻率越高,它產生的熱量就越多。即便筆記本內置了風扇和散

JS ---

pre javascrip 三種 rip 彈窗 提示信息 -- 允許 ext alert:帶有提示信息的警告彈窗。 confirm:允許用戶選擇的彈窗 prompt:帶有提示信息的可輸入的對話框 <script type="text/javascript">

筆記(ssm專案使用layui進行分頁)

  本篇文章較為簡單,實現的功能是分頁。下面貼程式碼。 <script src="layui.js" charset="utf-8"></script> <!-- 注意:如果你直接複製所有程式碼到本地,上述js路徑需要改成你本地的 -->

Delphi視窗

1.                   ShowMessage('恭喜你!!!');