Android 弹出全局dialog

项目中需要在网络断开连接时设置全局弹出框提醒,要求当网络断开的时候,在app内的任一页面均能弹出提示框提示用户网络断开,开始认为dialog需要依附在Activity上,后经查询可采取悬浮窗的模式,使其不必依附于Activity,可在任一页面弹出,代码如下:
  
  [java] view plain copy
  
  AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext());
  
  AlertDialog dialog=builder.setMessage("pc端断开连接,请及时保存编辑文档!")
  
  .setPositiveButton("确定",new DialogInterface.OnClickListener(){
  
  @Override
  
  public void onClick(DialogInterface dialogInterface, int i) {
  
  }
  
  }).create();
  
  dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
  
  dialog.setCanceledOnTouchOutside(false);//点击屏幕不消失
  
  if (!dialog.isShowing()){//此时提示框未显示
  
  dialog.show();
  
  }
  
  需添加dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);设置dialog的类型,同时要在清单文件中配置:
  
  [java] view plain copy
  
  <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
  
  添加该权限,若仍无法显示要到手机设置页面的,应用管理,找到自己的应用打开悬浮窗权限,若还是不行,可点击以下链接,寻找解决方法:
  
  https://www.zhihu.com/question/37849134。
  
  参考其他需要悬浮窗权限的app,都是默认不开启(测试机魅蓝note3),这就导致需要提醒用户设置,网上查阅资料,判断该权限是否开启,需要适配多种机型,极为不便,后经查询,可将dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);改为dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_TOAST);,此时不需要悬浮窗权限开启,该全局提示框亦可弹出。
  
  ---------------------------分割线-------------------------------------------------------
  
  使用dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_TOAST);会遇到版本问题,在Android 4.4以下,TYPE_TOAST虽不需要权限亦可弹出,但是取消了界面交互功能,无法获取触摸事件,造成主动点击按钮,dialog不消失,因此需要版本判断,问题详情见以下链接:
  
  http://www.jianshu.com/p/634cd056b90c
  
  namespace ModuleB.ViewModels
  
  {
  
  public class MessageListViewModel : BindableBase
  
  {
  
  IEventAggregator _ea;
  
  private ObservableCollection<string> _messages;
  
  public ObservableCollection<string> Messages
  
  {
  
  get { return _messages; }
  
  set { SetProperty(ref _messages, value); }
  
  }
  
  public MessageListViewModel(IEventAggregator ea)
  
  {
  
  _ea = ea;
  
  Messages = new ObservableCollection<string>();
  
  _ea.GetEvent<MessageSentEvent>().Subscribe(MessageReceived);
  
  }
  
  private void MessageReceived(string message)
  
  {
  
  Messages.Add(dasheng178.com/ message);
  
  }
  
  }
  
  }
  
  代码阅读:
  
  private ObservableCollection<string> _messages;
  
  public ObservableCollection<string> Messages
  
  {
  
  get { return _messages; }
  
  set { SetProperty(ref _messages, value)www.yongshiyule178.com; }
  
  }
  
  这是 <ListBox ItemsSource="{Binding Messages}"www.huarenyl.cn/  /> 中的Messages,他的类型是ObservableCollection,具体为什么是 ObservableCollection而不是List!后面再说。
  
  public MessageListViewModel(IEventAggregator ea)
  
  {
  
  _ea = ea;
  
  Messages = new ObservableCollection<string>();
  
  _ea.GetEvent<MessageSentEvent>(www.taohuayuan178.com).Subscribe(MessageReceived);
  
  }
  
  这里订阅了MessageSentEvent,并且处理Payload,dasheng178.com处理Payload的方法是MessageReceived,这个方法在Messages新增一条记录。
  
  事件聚合器可以有多个发布者和多个订阅者。
  
  标签: Prism, MVVM, ViewModel, Command, EventAggregator
  
  好文要顶 关注我 收藏该文
  
  丑拒
  
  关注 - 10
  
  粉丝 - 14
  
  +加关注
  
  0 0
  
  « 上一篇:从PRISM开始学WPF(六)MVVM(二)Command?
  
  posted @ 2018-04-03 13:12 丑拒 阅读(25) 评论(0) 编辑 收藏
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值