一丶概述

弹框在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中常见三种弹框在项目中的应用,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# android
# 弹框
# Android高德地图marker自定义弹框窗口
# Android自定义弹框样式
# Android启动页用户相关政策弹框的实现代码
# Android 实现抖音头像底部弹框效果的实例代码
# Android中 TeaScreenPopupWindow多类型筛选弹框功能的实例代码
# android自定义Dialog弹框和背景阴影显示效果
# Android 提交或者上传数据时的dialog弹框动画效果
# Android简单实现自定义弹框(PopupWindow)
# Android填坑系列:在小米系列等机型上放开定位权限后的定位请求弹框示例
# Android自定义弹框Dialog效果
# 对话框
# 三种
# 自定义
# 弹出
# 小编
# 都是
# 图二
# 下拉框
# 在这里
# 第一个
# 在此
# 下载地址
# 是这样
# 给大家
# 就说
# 跳转
# 一说
# 可通过
# 能为
# 较少
相关文章:
C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)
C++时间戳转换成日期时间的步骤和示例代码
利用JavaScript实现拖拽改变元素大小
深圳网站制作平台,深圳市做网站好的公司有哪些?
建站之星CMS建站配置指南:模板选择与SEO优化技巧
如何通过建站之星自助学习解决操作问题?
如何快速使用云服务器搭建个人网站?
网站制作新手教程,新手建设一个网站需要注意些什么?
定制建站模板如何实现SEO优化与智能系统配置?18字教程
广东企业建站网站优化与SEO营销核心策略指南
建站主机是否属于云主机类型?
中山网站推广排名,中山信息港登录入口?
广州商城建站系统开发成本与周期如何控制?
如何通过虚拟主机空间快速建站?
如何在Tomcat中配置并部署网站项目?
海南网站制作公司有哪些,海口网是哪家的?
如何在建站宝盒中设置产品搜索功能?
建站主机功能解析:服务器选择与快速搭建指南
如何优化Golang Web性能_Golang HTTP服务器性能提升方法
如何用PHP快速搭建CMS系统?
建站之星如何快速生成多端适配网站?
如何用VPS主机快速搭建个人网站?
头像制作网站在线制作软件,dw网页背景图像怎么设置?
番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?
php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】
深圳网站制作案例,网页的相关名词有哪些?
建站之星代理如何优化在线客服效率?
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
如何通过商城自助建站源码实现零基础高效建站?
建站主机SSH密钥生成步骤及常见问题解答?
如何选择服务器才能高效搭建专属网站?
山东云建站价格为何差异显著?
如何选择域名并搭建高效网站?
代购小票制作网站有哪些,购物小票的简要说明?
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
如何通过老薛主机一键快速建站?
建站主机无法访问?如何排查域名与服务器问题
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
如何在建站之星网店版论坛获取技术支持?
Python如何创建带属性的XML节点
外贸公司网站制作哪家好,maersk船公司官网?
建站之星导航如何优化提升用户体验?
建站之星代理商如何保障技术支持与售后服务?
建站主机是什么?如何选择适合的建站主机?
如何在阿里云香港服务器快速搭建网站?
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
浅析上传头像示例及其注意事项
ppt制作免费网站有哪些,ppt模板免费下载网站?
教学网站制作软件,学习*后期制作的网站有哪些?
上海网站制作开发公司,上海买房比较好的网站有哪些?
*请认真填写需求信息,我们会在24小时内与您取得联系。