Android&对话框最全面的使用介绍,2024最新阿里Android面试流程

深入理解Android对话框组件:AlertDialog、DialogFragment与ProgressDialog的使用与定制

输入框的问题:

如果给AlertDialog自定义View里面插入了EditText是无法弹出键盘的, 可以添加以下代码

Window alertDialogWindow = mAlertDialog.getWindow();
alertDialogWindow.clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

如果想输入框自动弹出

alertDialogWindow.setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

监听器

取消监听器

取消监听器是点击对话框外部的方式关闭了对话框. 调用dismiss方法关闭的时候不会回调

AlertDialog.Builder setOnCancelListener (DialogInterface.OnCancelListener onCancelListener)

关闭监听器

该监听器是在AlertDialog调用了dismiss()方法或者点击了对话框外部都会回调的监听器.

AlertDialog.Builder setOnDismissListener (DialogInterface.OnDismissListener onDismissListener)

ListAdapter条目监听器

该方法是你将ListAdapter设为对话框条目显示的时候使用的方法

AlertDialog.Builder setOnItemSelectedListener (AdapterView.OnItemSelectedListener listener)

按键监听器

可以接受按键的事件. 可用于在弹出对话框后屏蔽按键.

AlertDialog.Builder setOnKeyListener (DialogInterface.OnKeyListener onKeyListener)

总结

如果完全不需要AlertDialog的任何元素(按钮/标题/点击事件)可以继承Dialog自定义实现, 当然我是不推荐仿IOS对话框的;

如果完全使用自定义的对话框我更推荐DialogFragment来实现(后面讲解)

奇淫技巧

自动弹出键盘

Dialog如果存在输入框是无法自动弹出键盘的, 以下函数可以实现;

public static void showInputMethod(EditText editText) {
editText.setFocusable(true);
editText.setFocusableInTouchMode(true);
editText.requestFocus();
InputMethodManager imm = (InputMethodManager) Library.getApp()
.getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
}
}

设置列表分割线

AlertDialog可以设置列表, 但是没有设置分隔物的函数;

public static void setDivider(AlertDialog dialog, @DrawableRes int divider) {
ListView listView = dialog.getListView();
if (listView != null) {
listView.setOverscrollFooter(new ColorDrawable(Color.TRANSPARENT));
listView.setDivider(Res.getDrawable(divider));
}
}

背景透明

public static void setTransparent(Dialog dialog) {
Window window = dialog.getWindow();
if (window != null) {
window.setBackgroundDrawableResource(android.R.color.transparent);
}
}

设置对话框尺寸
  1. DialogFragment 设置主题, 缺点: 强制最大宽度

dialog.setStyle(
androidx.fragment.app.DialogFragment.STYLE_NO_TITLE,
android.R.style.Theme_Material_Light_Dialog_MinWidth
)

  1. 将布局再多包裹一层. 因为DialogFragment顶层的尺寸会失效, 但是Dialog不会. 缺点: 只能设置固定值

  2. 设置Window布局参数, 缺点: 只能设置固定值

Dialog有一个默认的宽度, 高度是包裹适应的; 但是有时候还是需要控制的; 注意一定要在对话框显示之后执行以下函数;

ProgressDialog

除了以上的警示对话框的使用外. 还提供一种单独的对话框样式. 进度条对话框. 进度条是计算机应用历史上一个伟大的发明.

ProgressDialog progressDialog = new ProgressDialog(this);// 创建进度对话框对象
progressDialog.setTitle(“标题”); // 设置标题
progressDialog.setMessage(“加载中…”); // 设置消息
progressDialog.show(); // 显示进度条

除了上面这种默认进度条样式, Google还提供设置样式水平进度条

progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
//ProgressDialog.STYLE_SPINNER 旋转进度条, 默认就是这种样式

方法介绍

ProgressDialog是AlertDialog的子类. 继承了其所有方法. 所以这里我只讲新增的方法.

进度设置

既然是进度对话框当然提供设置进度的方法, 默认的旋转进度条样式是无法设置进度的. 该方法必须在show()后面执行才生效.

int getProgress ()

void setProgress (int value)

最大进度

void setMax (int max)

int getMax ()

显示

可以用父类的show()方法. 也可以用ProgressDialog新增的静态方法直接一行代码显示.类似于Toast的用法.

ProgressDialog show (Context context, // 上下文
CharSequence title, // 标题
CharSequence message) // 消息内容

ProgressDialog show (Context context,
CharSequence title,
CharSequence message,
boolean indeterminate)

ProgressDialog show (Context context,
CharSequence title,
CharSequence message,
boolean indeterminate,
boolean cancelable)

ProgressDialog show (Context context,
CharSequence title,
CharSequence message,
boolean indeterminate,
boolean cancelable,
DialogInterface.OnCancelListener cancelListener)

次要进度

类似于你看视频的时候的缓存进度条. 比主进度条的颜色浅一些.

void setSecondaryProgress (int secondaryProgress)

int getSecondaryProgress ()

增长进度

和setProgress的区别是该修改是在原有的进度基础上增加或者减少. 并且不需要在乎在show()方法之前还是之后.

void incrementProgressBy (int diff) // 进度增加

void incrementSecondaryProgressBy (int diff) // 次要进度增加

不确定状态进度条

该效果只针对水平进度条. 进度条的状态显示在不断地变化.

void setIndeterminate (boolean indeterminate) // 默认为false. true开启效果

boolean isIndeterminate () // 是否处于不确定状态

void setIndeterminateDrawable (Drawable d) // 设置一个图片作为不确定进度的显示

进度样式

void setProgressStyle (int style)

包括两个参数:

  1. STYLE_HORIZONTAL 水平进度条
  2. STYLE_SPINNER 环形进度条
设置进度图片

该方法只有在ProgressDialog为水平样式时才有效.

void setProgressDrawable (Drawable d)

进度显示格式化

void setProgressNumberFormat (String format)

使用一个字符串来格式化的进度对话框右下角的文字内容. 如果传入null将不显示任何内容.

%1d: 当前进度百分比

%2d: 最大进度百分比

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

举个例子如果想显示下载内容的大小(/kb为单位) , 可以这么写

setProgressNumberFormat(“%1dkb/%2dkb”)

当然你随便写个内容也行

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

进度条百分比格式化

这里用到一个类NumberFormat, 该类是格式化数字的工具. 抽象类需要通过getInstance**()方法创建对象. 这个类方法有点多我就不细讲了. 这个百分比格式化用的也少.

参数设为null, 进度条左下角的百分比将不会显示.

void setProgressPercentFormat (NumberFormat format)

示例:

// getCurrencyInstance 是一个货币格式化的方法
dialog.setProgressPercentFormat(NumberFormat.getCurrencyInstance());

ProgressBar

ProgressBar是作为控件使用的进度条. 且只能写在布局文件中使用. ProgressDialog的实现原理就是创建一个包含了ProgressDialog的View显示.

进度条对话框还可以在布局文件中直接写入作为控件, 同时该类只可以在布局中使用才会显示. 系统提供的水平进度样式. StyleProgressBar.Horizontal

<ProgressBar
style=“@style/Base.Widget.AppCompat.ProgressBar.Horizontal”
android:progress=“50”
android:max=“100”
android:layout_gravity=“center”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”/
/>

顺带一提, 进度条不能在子线程开启(show)但是可以在子线程关闭(dismiss).

DialogFragment

该类属于Fragment的子类, 也是官方推荐的对话框.

对于需要自定义的对话框内容我是推荐DialogFragment的. 普通对话框推荐使用默认的altertDialog 强烈不推荐ios效果的滚轮控件, 什么年代的设计, 丑而且不方便

和一般的Fragment一样用法.

public class CustomDialogFragment extends DialogFragment {

/**

  • 和一般Fragment的onCreate方法一样
  • @param inflater
  • @param container
  • @param savedInstanceState
  • @return 返回View对象
    */
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    return super.onCreateView(inflater, container, savedInstanceState);
    }

/**

  • 用于在Fragment里面嵌套Dialog, 和上面的方法两选一实现即可.
  • 如果两个都写了只有这个方法生效
  • @param savedInstanceState
  • @return 返回Dialog对象
    */
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
    return super.onCreateDialog(savedInstanceState);
    }
    }

在Activity里面显示

new CustomDialogFragment().show(getSupportFragmentManager(), “bag”);

注意DialogFragment如果使用的是onCreateView的话. 布局文件的根布局无论是match_parent还是给定值都算作wrap_content. 要想控制对话框的尺寸就写个子容器布局.

DialogFragment无法全屏显示

<RelativeLayout xmlns:android=“http://schemas.android.com/apk/res/android”
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:orientation=“vertical”

<RelativeLayout
android:layout_width=“match_parent”
android:layout_height=“match_parent”


声明周期方法

这里介绍的都是用于重写的周期回调方法. 注意DialogFragment是Fragment的子类. 包括Fragment的所有生命周期

关闭

当dismiss方法关闭对话框时回调该方法

void onDismiss (DialogInterface dialog)

取消

点击DialogFragment外部取消对话框回调的方法

void onCancel (DialogInterface dialog)

调用方法

用于调用的方法

显示对话框
  • 一般的用法显示DialogFragment, 会作为一般的Fragment嵌套在Activity中
  • 使用以下方法将把DialogFragment作为对话框弹窗显示

void show (FragmentManager manager,
String tag) // 标签. 这些参数其实只要会Fragment都能看懂.

int show (FragmentTransaction transaction,
String tag)

关闭对话框

void dismiss ()

是否可取消

即点击对话框外部是否可以关闭对话框

void setCancelable (boolean cancelable)
boolean isCancelable ()

得到对话框对象

Dialog getDialog () // 得到onCreateDialog方法返回的Dialog对象

是否作为对话框显示

如果设为false则将和Fragment一样创建布局而不是对话框. 这个方法需要在onCreateDialog方法之前执行才有效. 推荐onCreate方法里面执行 . 不过如果你设为false, DialogFragment的show方法将无效.

该方法没啥卵用.

boolean getShowsDialog ()

void setShowsDialog (boolean showsDialog) // 默认为true

主题样式

必须在onCreateDialog方法执行前调用. 即onCreate方法里面调用.

void setStyle (int style, // 样式
int theme) // 主题, 如果0则使用默认主题

style支持四种参数值:

  1. STYLE_NORMAL 普通
  2. STYLE_NO_FRAME 无边框
  3. STYLE_NO_INPUT 无法得到焦点. 将无法输入或者点击
  4. STYLE_NO_TITLE 无标题
得到DialogFragment的主题

对应得到setStyle()方法设置的主题.

int getTheme ()

取消状态丢失

详情看Fragment的commitAllowingStateLoss方法

void dismissAllowingStateLoss ()

关于宽度被限制到范围的问题

// 解决宽度限制问题
setStyle(DialogFragment.STYLE_NO_TITLE, android.R.style.Theme_Holo_Light_Dialog_MinWidth);

// 透明背景
getDialog().getWindow().setBackgroundDrawableResource(android.R.color.transparent);

Activity

Activity作为对话框. 只需要在主题中继承dialog的主题即可. 然后正常打开该activity即可.

示例

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

学习福利

【Android 详细知识点思维脑图(技能树)】

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。

这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

由于篇幅有限,这里以图片的形式给大家展示一小部分。

详细整理在GitHub点击可见;

Android架构视频+BAT面试专题PDF+学习笔记

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

度。so,出去面试时先看看自己复习到了哪个阶段就好。

虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。

这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

由于篇幅有限,这里以图片的形式给大家展示一小部分。

[外链图片转存中…(img-iy1gOsRZ-1711301298930)]

详细整理在GitHub点击可见;

Android架构视频+BAT面试专题PDF+学习笔记

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值