热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

AndroidDialog仿ios9中UIAlertController控件

这篇文章主要为大家详细介绍了AndroidDialog仿ios9中UIAlertController控件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

最近因为项目需要,用Android Dialog仿ios9中的UIAlertController控件,第一次对自定义控件进行封装,请大家多多指教

如图所示,当我封装的Dialog被触发时,从底部弹出,点击取消键整个弹框会消失,当点击不同的TextView会有相应的点击事件发生,目前只写了三个能被点击的TextView(以后会改为可以动态添加个数)。
以下代码是我封装的BottomDialog:

public class BottomDialog extends Dialog {
 private TextView mTitleTv;
 private TextView mOneTv;
 private TextView mTwoTv;
 private TextView mCancelTv;
 private Dialog myDialog;
 private ClickListenerInterface clickListenerInterface;

 public interface ClickListenerInterface {
  void onTitleClick();//点击标题TextView

  void onOneClick();//点击第一个TextView

  void onTwoClick();//点击第二个TextView
 }

 public BottomDialog(@NonNull Context context) {
  super(context);
  init();
 }

 public BottomDialog(@NonNull Context context, @StyleRes int themeResId) {
  super(context, themeResId);
  init();
 }

 protected BottomDialog(@NonNull Context context, boolean cancelable, @Nullable OnCancelListener cancelListener) {
  super(context, cancelable, cancelListener);
  init();
 }

 private void init() {
  myDialog = new Dialog(getContext(), R.style.BottomDialogStyle);
  //填充对话框的布局
  View view = LayoutInflater.from(getContext()).inflate(R.layout.dialog_bottom, null);
  //初始化控件
  mTitleTv = (TextView) view.findViewById(R.id.tv_dialog_title);
  mOneTv= (TextView) view.findViewById(R.id.tv_dialog_one);
  mTwoTv = (TextView) view.findViewById(R.id.tv_dialog_two);
  mCancelTv = (TextView) view.findViewById(R.id.tv_dialog_cancel);

  mTitleTv.setOnClickListener(new DialogClickListener());
  mOneTv.setOnClickListener(new DialogClickListener());
  mTwoTv.setOnClickListener(new DialogClickListener());
  mCancelTv.setOnClickListener(new DialogClickListener());

  //将布局设置给Dialog
  myDialog.setContentView(view);
  //获取当前Activity所在的窗体
  Window dialogWindow = myDialog.getWindow();
  //设置Dialog从窗体底部弹出
  dialogWindow.setGravity(Gravity.BOTTOM);

  //获得窗体的属性
  WindowManager.LayoutParams lp = dialogWindow.getAttributes();
  lp.width = (int) (dialogWindow.getWindowManager().getDefaultDisplay().getWidth() * 0.95);
  lp.y = 20; //设置Dialog距离底部的距离
  dialogWindow.setAttributes(lp); //将属性设置给窗体
  myDialog.show();//显示对话框
 }

 public void setClicklistener(ClickListenerInterface clickListenerInterface) {
  this.clickListenerInterface = clickListenerInterface;
 }

 private class DialogClickListener implements View.OnClickListener {
  @Override
  public void onClick(View v) {
   switch (v.getId()) {
    case R.id.tv_dialog_title:
     clickListenerInterface.onTitleClick();
     break;
    case R.id.tv_dialog_one:
     clickListenerInterface.onOneClick();
     break;
    case R.id.tv_dialog_two:
     clickListenerInterface.onTwoClick();
     break;
    case R.id.tv_dialog_cancel:
     myDialog.dismiss();
     break;
   }
  }
 }

 public void dismissDialog() {
  if (myDialog != null && myDialog.isShowing()) {
   myDialog.dismiss();
  }
 }

 /**
  * 设置标题栏文本文字
  *
  * @param stringId
  * @see #setTitleText(String)
  */
 public void setTitleText(@StringRes int stringId) {
  setTitleText(getContext().getString(stringId));
 }

 /**
  * 设置标题栏文本文字
  *
  * @param text
  */
 public void setTitleText(String text) {
  mTitleTv.setText(text);
  mTitleTv.setVisibility(View.VISIBLE);
 }

 /**
  * 设置第一个TextView文字
  *
  * @param stringId
  */
 public void setOneText(@StringRes int stringId) {
  setOneText(getContext().getString(stringId));
 }

 /**
  * 设置第一个TextView文字
  *
  * @param text
  */
 public void setOneText(String text) {
  mOneTv.setText(text);
  mOneTv.setVisibility(View.VISIBLE);
 }

 /**
  * 设置第二个TextView文字
  *
  * @param stringId
  */
 public void setTwoText(@StringRes int stringId) {
  setTwoText(getContext().getString(stringId));
 }

 /**
  * 设置第二个TextView文字
  *
  * @param text
  */
 public void setTwoText(String text) {
  mTwoTv.setText(text);
  mTwoTv.setVisibility(View.VISIBLE);
 }

 /**
  * 获取标题栏文本
  *
  * @return
  */
 public final TextView getTitleTv() {
  return mTitleTv;
 }

 /**
  * 获取第一个文本
  *
  * @return
  */
 public final TextView getOneTv() {
  return mOneTv;
 }

 /**
  * 获取第二个文本
  *
  * @return
  */
 public final TextView getTwoTv() {
  return mTwoTv;
 }


 /**
  * 设置字体颜色
  *
  * @param titleColor 标题的颜色,默认是灰色
  * @param otherColor 其他的颜色,默认是蓝色
  * @param i   有2种模式,1(标题和其他颜色不一样)2(标题和其他颜色一样,取消键不一样)
  */
 public void setColor(int titleColor, int otherColor, int i) {
  if (i == 1) {
   mTitleTv.setTextColor(ContextCompat.getColor(getContext(), titleColor));
   mOneTv.setTextColor(ContextCompat.getColor(getContext(), otherColor));
   mTwoTv.setTextColor(ContextCompat.getColor(getContext(), otherColor));
  }
  if (i == 2) {
   mTitleTv.setTextColor(ContextCompat.getColor(getContext(), titleColor));
   mOneTv.setTextColor(ContextCompat.getColor(getContext(), titleColor));
   mTwoTv.setTextColor(ContextCompat.getColor(getContext(), titleColor));
   mCancelTv.setTextColor(ContextCompat.getColor(getContext(), otherColor));
  }
 }

 @Override
 public void onProvideKeyboardShortcuts(List data, @Nullable Menu menu, int deviceId) {

 }
}

在Activity中的应用:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
 private BottomDialog bottomDialog;
 private Button mButton;
 private TextView mTextView;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 mButton = (Button) findViewById(R.id.button);
 mTextView = (TextView) findViewById(R.id.textView);

 mButton.setOnClickListener(this);
 }

 @Override
 public void onClick(View v) {
 switch (v.getId()) {
  case R.id.button:
   showBottomDialog();
  break;
 }
 }

 /**
 * 展示
 */
 private void showBottomDialog() {
 bottomDialog = new BottomDialog(this);
 bottomDialog.setClicklistener(new BottomDialog.ClickListenerInterface() {
  @Override
  public void onTitleClick() {

  }

  @Override
  public void onOneClick() {
  mTextView.setText(bottomDialog.getOneTv().getText().toString());
  }

  @Override
  public void onTwoClick() {
  mTextView.setText(bottomDialog.getTwoTv().getText().toString());
  }
 });
 }
}


被封装的Dialog主要提供的方法有:修改相应的TextView文字和颜色,提供点击相应的TextView的点击事件。

这里的点击事件主要用的是回调的方法,在Dialog中定义一个接口,在点击事件调用这个接口,当在Activity中触发这个回调接口时,点击事件产生。

主要代码是:

 private ClickListenerInterface clickListenerInterface;

 public interface ClickListenerInterface {
  void onTitleClick();//点击标题TextView

  void onOneClick();//点击第一个TextView

  void onTwoClick();//点击第二个TextView
 }

  public void setClicklistener(ClickListenerInterface clickListenerInterface) {
  this.clickListenerInterface = clickListenerInterface;
 }

 private class DialogClickListener implements View.OnClickListener {
  @Override
  public void onClick(View v) {
   switch (v.getId()) {
    case R.id.tv_dialog_title:
     clickListenerInterface.onTitleClick();
     break;
    case R.id.tv_dialog_one:
     clickListenerInterface.onOneClick();
     break;
    case R.id.tv_dialog_two:
     clickListenerInterface.onTwoClick();
     break;
    case R.id.tv_dialog_cancel:
     myDialog.dismiss();
     break;
   }
  }
 }

最后说一下更改文字颜色的方法:

public void setColor(int titleColor, int otherColor, int i) {}

第一个传的颜色是修改最上面的TextView,第二个传的颜色是修改其他的文字颜色,第三个参数是表明你选用哪种模式,分别传1或2,有2种模式

  1. 标题和其他颜色不一样
  2. 标题和其他颜色一样,取消键不一样

下面是我的Github地址

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 网络运维工程师负责确保企业IT基础设施的稳定运行,保障业务连续性和数据安全。他们需要具备多种技能,包括搭建和维护网络环境、监控系统性能、处理突发事件等。本文将探讨网络运维工程师的职业前景及其平均薪酬水平。 ... [详细]
  • Vue 2 中解决页面刷新和按钮跳转导致导航栏样式失效的问题
    本文介绍了如何通过配置路由的 meta 字段,确保 Vue 2 项目中的导航栏在页面刷新或内部按钮跳转时,始终保持正确的 active 样式。具体实现方法包括设置路由的 meta 属性,并在 HTML 模板中动态绑定类名。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • 本文介绍如何通过SQL查询从JDE(JD Edwards)系统中提取所有字典数据,涵盖关键表的关联和字段选择。具体包括F0004和F0005系列表的数据提取方法。 ... [详细]
  • 本文详细介绍了如何通过命令行启动MySQL服务,包括打开命令提示符窗口、进入MySQL的bin目录、输入正确的连接命令以及注意事项。文中还提供了更多相关命令的资源链接。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 本文介绍如何使用 NSTimer 实现倒计时功能,详细讲解了初始化方法、参数配置以及具体实现步骤。通过示例代码展示如何创建和管理定时器,确保在指定时间间隔内执行特定任务。 ... [详细]
  • 本文介绍了在Windows环境下使用pydoc工具的方法,并详细解释了如何通过命令行和浏览器查看Python内置函数的文档。此外,还提供了关于raw_input和open函数的具体用法和功能说明。 ... [详细]
  • 在现代网络环境中,两台计算机之间的文件传输需求日益增长。传统的FTP和SSH方式虽然有效,但其配置复杂、步骤繁琐,难以满足快速且安全的传输需求。本文将介绍一种基于Go语言开发的新一代文件传输工具——Croc,它不仅简化了操作流程,还提供了强大的加密和跨平台支持。 ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 高效解决应用崩溃问题!友盟新版错误分析工具全面升级
    友盟推出的最新版错误分析工具,专为移动开发者设计,提供强大的Crash收集与分析功能。该工具能够实时监控App运行状态,快速发现并修复错误,显著提升应用的稳定性和用户体验。 ... [详细]
  • 从零开始构建完整手机站:Vue CLI 3 实战指南(第一部分)
    本系列教程将引导您使用 Vue CLI 3 构建一个功能齐全的移动应用。我们将深入探讨项目中涉及的每一个知识点,并确保这些内容与实际工作中的需求紧密结合。 ... [详细]
  • 本文介绍如何通过SSH协议使用Xshell远程连接到Ubuntu系统。为了实现这一目标,需要确保Ubuntu系统已安装并配置好SSH服务器,并保证网络连通性。 ... [详细]
author-avatar
剛強是什麼
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有