2024年Android&对话框最全面的使用介绍,小米面试结果

最后

我的面试经验分享可能不会去罗列太多的具体题目,因为我依然认为面试经验中最宝贵的不是那一个个具体的题目或者具体的答案,而是结束面试时,那一刻你的感受以及多天之后你的回味~

很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习,对此我整理了一些资料,需要的可以免费分享给大家

在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

【Android核心高级技术PDF文档,BAT大厂面试真题解析】

【算法合集】

【延伸Android必备知识点】

【Android部分高级架构视频学习资源】

**Android精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

AlertDialog.Builder setTitle (CharSequence title)

AlertDialog.Builder setTitle (int titleId)

上面的方法标题只是文字的形式而已. 而下面的方法可以在标题的位置自定义任何view对象来显示.

AlertDialog.Builder setCustomTitle (View customTitleView)

标题图标

即在标题的左边加上一个图片作为图标显示

AlertDialog.Builder setIcon (Drawable icon)

AlertDialog.Builder setIcon (int iconId)

还有一个通过主题的属性来设置对话框图标. 我不懂

AlertDialog.Builder setIconAttribute (int attrId)

自定义对话框显示

可以自定义对话框显示任何内容. 注意即使你自定义了对话框. 你如果使用设置确定和取消按钮依旧会显示;

AlertDialog.Builder setView (int layoutResId) // 布局文件即可

AlertDialog.Builder setView (View view) // View对象

输入框的问题:

如果给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即可.

示例

这里我取消了标题栏和背景透明.

注意activity的根布局千万不要设置为match_parent全屏显示.

BottomSheetDialog

added in version 23.2.0

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

示例代码

public class MainActivity extends AppCompatActivity {

private BottomSheetDialog mDialog;

@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);

mDialog = new BottomSheetDialog(this);
mDialog.setContentView(R.layout.dialog_bottom_sheet);
}

@OnClick(R.id.button) public void onClick() {
mDialog.show();
}
}

Dialog创建需要代码构建实例对象不用我多说

构造方法

BottomSheetDialog(Context context)

BottomSheetDialog(Context context, int theme)

设置选项

void setCanceledOnTouchOutside(boolean cancel) // 触摸范围外取消对话框

void setCancelable(boolean cancelable) // 返回键和触摸范围外都不能取消对话框

// 设置对话框内容
void setContentView(View view)
void setContentView(int layoutResId)
void setContentView(View view, ViewGroup.LayoutParams params)

BottomSheetFragment

前面介绍过DialogFragment. 而这里提到的BottomSheetDialogFragment用法一致. 不另作介绍.

BottomSheetBehavior

总结

Android架构学习进阶是一条漫长而艰苦的道路,不能靠一时激情,更不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!

上面分享的字节跳动公司2021年的面试真题解析大全,笔者还把一线互联网企业主流面试技术要点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

【Android高级架构视频学习资源】

Android部分精讲视频领取学习后更加是如虎添翼!进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

,必须养成平时努力学习的习惯。所以:贵在坚持!

上面分享的字节跳动公司2021年的面试真题解析大全,笔者还把一线互联网企业主流面试技术要点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。
[外链图片转存中…(img-wCX50u6r-1714816512528)]

【Android高级架构视频学习资源】

Android部分精讲视频领取学习后更加是如虎添翼!进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 12
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值