浅析Android中常见三种弹框在项目中的应用

一丶概述

弹框在Android项目中经常出现,常见的实现方法有三种:Dialog 弹框,Window弹框,Activity伪弹框。本文就说一说三种弹框的实现及在项目中的运用。

二丶演示图

       

图一为常见的三种弹框(文末上链接),图二为项目中用到的Activity伪弹框

三丶正文

1.Dialog弹框

先看一篇一篇文章:

android 8种对话框(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;
   }
  }
}

这个就厉害了,展现,隐藏,点击监听都是自己写的方法,原来点击窗口外关闭窗口是这样实现的,是不是又学到了

然后是关于:

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

简单得不能再简单,跳转跳转到另一个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;
   }
  }
}

代码下载地址:https://github.com/BabyWu/SmallWindows

以上所述是小编给大家介绍的浅析Android中常见三种弹框在项目中的应用,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Android Animation实战之屏幕底部弹出PopupWindow

    Android动画的一个实战内容,从屏幕底部滑动弹出PopupWindow. 相信这种效果大家在很多APP上都遇到过,比如需要拍照或者从SD卡选择图片,再比如需要分享某些东西时,大多会采用这么一种效果: 那这种效果如何实现呢? 我们仿写一个这种效果的实例吧: 1)我们首先定义一下,弹出窗口的页面布局组件:take_photo_pop.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout

  • Android编程实现popupwindow弹出后屏幕背景变成半透明效果

    本文实例讲述了Android编程实现popupwindow弹出后屏幕背景变成半透明效果的方法.分享给大家供大家参考,具体如下: android中popupwindow弹出后,屏幕背景变成半透明这个效果很普通.实现的方法也很多.我使用的可能是最简单的一种,就是设置一下getWindows的透明度.不多说上代码 /** * 设置添加屏幕的背景透明度 * @param bgAlpha */ public void backgroundAlpha(float bgAlpha) { WindowManag

  • Android简单实现自定义弹框(PopupWindow)

    一:一般都是先上效果图 二:实现步骤: 1.xml布局实现 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height=&quo

  • Android填坑系列:在小米系列等机型上放开定位权限后的定位请求弹框示例

    背景 近期因实际项目需要,在特定操作下触发定位请求,取到用户位置及附近位置. 问题: 经初步选型,最终决定接入百度定位,按照百度定位SDK Android文档,接入过程相对顺利. 但随后发现,在小米系列等部分机型上,进入app后会出现"正在尝试 通过网络或者卫星对您的手机进行定位". 很影响用户体验. 解决过程: 1.Flurry的小坑 项目中引入了数个第三方SDK,主要包括Flurry,友盟,个推,百度定位SDK等.在App启动初始化及进入到首页的执行流中,主要涉及到Flurry,友

  • android使用PopupWindow实现页面点击顶部弹出下拉菜单

    实现此功能没有太多的技术难点,主要通过PopupWindow方法,同时更进一步加深了PopupWindow的使用,实现点击弹出一个自定义的view,view里面可以自由设计,比较常用的可以放一个listview. demo中我只是一个点击展示,简单的使用了fade in out的动画效果,也没有精美的图片资源,看着也丑,不过这么短的时间,让你掌握一个很好用的技术,可以自己扩展,不很好么? 废话不说了,直接上代码: MainActivity.java public class MainActivi

  • android PopupWindow 和 Activity弹出窗口实现方式

    本人小菜一个.目前只见过两种弹出框的实现方式,第一种是最常见的PopupWindow,第二种也就是Activity的方式是前几天才见识过.感觉很霸气哦.没想到,activity也可以做伪窗口. 先贴上最常见的方法,主要讲activity的方法. 一.弹出PopupWindow 复制代码 代码如下: /** * 弹出menu菜单 */ public void menu_press(){ if(!menu_display){ //获取LayoutInflater实例 inflater = (Layo

  • android popwindow实现左侧弹出菜单层及PopupWindow主要方法介绍

    PopupWindow可以实现浮层效果,主要方法有:可以自定义view,通过LayoutInflator方法:可以出现和退出时显示动画:可以指定显示位置等. 为了将PopupWindow的多个功能展现并力求用简单的代码实现,编写了一个点击按钮左侧弹出菜单的功能,实现出现和退出时显示动画效果并点击其他区域时弹出层自动消失,效果图如下: 源码: 1.PopwindowOnLeftActivity.java 复制代码 代码如下: package com.pop.main; import android

  • Android入门之PopupWindow用法实例解析

    本文实例介绍一下PopupWindow对话框.PopupWindow是阻塞对话框,只有在外部线程 或者 PopupWindow本身做退出操作才可以执行.PopupWindow完全依赖Layout做外观,在常见的开发中,PopupWindow应该会与AlertDialog常混用. 先贴出本例中运行的结果图: main.xml的源码如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmln

  • Android PopupWindow 点击外面取消实现代码

    private void showPopupView() { if (mPopupWindow == null) { View view = getLayoutInflater().inflate(R.layout.newest_layout, null); mPopupWindow = new PopupWindow(view, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); mPopupWindow.setFocusable(tr

  • Android之用PopupWindow实现弹出菜单的方法详解

    在使用UC-WebBrowser时,你会发现它的弹出菜单跟系统自带的菜单不一样.它实现更多菜单选项的显示和分栏.其实,它的本身是PopupWindow或者是AlertDialog对话框,在里面添加两个GridView控件,一个是菜单标题栏,一个是菜单选项.菜单选项视图的切换可以通过适配器的变换,轻松地实现.点击下载该实例:一.运行截图:           二.实现要点:(1)屏蔽系统弹出的菜单:1.首先创建至少一个系统的菜单选项 复制代码 代码如下: @Override public bool

随机推荐