2024年最全用于替代 Android 自带 Dialog 和 PopupWindow(2),android开发学习

最后

考虑到文章的篇幅问题,我把这些问题和答案以及我多年面试所遇到的问题和一些面试资料做成了PDF文档

喜欢的朋友可以关注、转发、点赞 感谢!

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

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

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

集成

  • 添加 jitpack 库

// build.gradle(Project:)

allprojects {

repositories {

maven { url ‘https://www.jitpack.io’ }

}

}

  • 添加依赖

点击查看最新版本号 从 2.3.1 版本开始,版本号前不加 v,引用时需要注意。

// build.gradle(Module:)

dependencies {

// 完整引入

implementation ‘com.github.goweii:AnyLayer:2.5.0’

// 基础库

implementation ‘com.github.goweii.AnyLayer:anylayer:2.5.0’

// 通用弹窗(依赖基础库)

implementation ‘com.github.goweii.AnyLayer:anylayer-common:2.5.0’

}

调用

Dialog 效果

AnyLayer.with(this)

.contentView(R.layout.dialog_test_2)

.bindData(new LayerManager.IDataBinder() {

@Override

public void bind(AnyLayer anyLayer) {

// TODO 绑定数据

}

})

.backgroundColorRes(R.color.dialog_bg)

.onClickToDismiss(R.id.fl_dialog_yes, R.id.fl_dialog_no)

.show();

PopupWindow 效果

AnyLayer.target(targetView)

.contentView(R.layout.dialog_test_4)

.alignment(Alignment.Direction.VERTICAL, Alignment.Horizontal.CENTER, Alignment.Vertical.BELOW, true)

.backgroundColorRes(R.color.dialog_bg)

.contentAnim(new LayerManager.IAnim() {

@Override

public Animator inAnim(View content) {

return AnimHelper.createTopInAnim(content);

}

@Override

public Animator outAnim(View content) {

return AnimHelper.createTopOutAnim(content);

}

})

.show();

API

===

AnyLayer


构建一个弹窗

/**

  • 如果需要全局弹窗,必须现在 Application 中初始化

  • 2.4.0 之后不再需要初始化也可全局弹窗

**/

@Deprecated

public static void init(@NonNull Application application)

/**

  • 有背景高斯模糊弹窗,建议提前调用该方法初始化

  • 不用在 Application 调用,可放到启动页中进行,避免影响 APP 启动速度

  • 也可在用到的 Activity 的 onCreate 方法中

**/

public static void initBlurred(@NonNull Context context)

/**

  • 有背景高斯模糊弹窗,在用到的 Activity 的 onCreate 方法中初始化后可在 onDestroy 中回收

**/

public static void recycleBlurred()

/**

  • 此时不需要 APP 存在 Activity 实例

  • 会新启动一个 Activity 并向根布局添加一个浮层

*/

public static void with(@Nullable Context context, LayerActivity.OnLayerCreatedCallback callback)

/**

  • 向窗口根布局添加一个浮层

  • 需要在 Application 中调用{@link AnyLayer#init(Application)}

**/

public static AnyLayer with()

/**

  • 向父布局 viewGroup 添加一个浮层

*/

public static AnyLayer with(@NonNull ViewGroup viewGroup)

/**

  • 向窗口根布局添加一个浮层

**/

public static AnyLayer with(@NonNull Context context)

/**

  • 向窗口根布局添加一个浮层,且位置参照 targetView

**/

public static AnyLayer target(@NonNull View targetView)

/**

  • 设置自定义 View

**/

public AnyLayer contentView(@NonNull View contentView)

/**

  • 设置自定义布局文件

**/

public AnyLayer contentView(@LayoutRes int contentViewId)

/**

  • 设置自定义布局文件中状态栏的占位 View

  • 该控件高度将设置为状态栏高度,可用来使布局整体下移,避免状态栏遮挡

**/

public AnyLayer asStatusBar(@IdRes int statusBarId)

/**

  • 绑定数据

**/

public AnyLayer bindData(LayerManager.IDataBinder dataBinder)

/**

  • 设置显示状态改变的监听

**/

public AnyLayer onVisibleChangeListener(LayerManager.OnVisibleChangeListener mOnVisibleChangeListener)

/**

  • 设置变更为显示状态监听

**/

public AnyLayer onLayerShowListener(LayerManager.OnLayerShowListener onLayerShowListener)

/**

  • 设置变更为隐藏状态监听

**/

public AnyLayer onLayerDismissListener(LayerManager.OnLayerDismissListener onLayerDismissListener)

/**

  • 设置子布局的 gravity,可直接在布局文件指定 layout_gravity 属性,作用相同

**/

public AnyLayer gravity(int gravity)

/**

  • 当以 target 方式创建时为参照 View 位置显示

  • 可自己指定浮层相对于参照 View 的对齐方式

  • @param direction 主方向

  • @param horizontal 水平对齐方式

  • @param vertical 垂直对齐方式

  • @param inside 是否强制位于屏幕内部

**/

public AnyLayer alignment(@NonNull Alignment.Direction direction,

@NonNull Alignment.Horizontal horizontal,

@NonNull Alignment.Vertical vertical,

boolean inside)

/**

  • 自定义浮层的进入和退出动画,可使用工具类{@link AnimHelper}

**/

public AnyLayer contentAnim(LayerManager.IAnim contentAnim)

/**

  • 自定义浮层的进入动画

**/

public AnyLayer contentInAnim(@AnimRes int anim)

/**

  • 自定义浮层的进入动画

**/

public AnyLayer contentInAnim(@NonNull Animation anim)

/**

  • 自定义浮层的退出动画

**/

public AnyLayer contentOutAnim(@AnimRes int anim)

/**

  • 自定义浮层的退出动画

**/

public AnyLayer contentOutAnim(@NonNull Animation anim)

/**

  • 自定义背景的进入和退出动画,可使用工具类{@link AnimHelper}

**/

public AnyLayer backgroundAnim(LayerManager.IAnim backgroundAnim)

/**

  • 自定义背景的进入动画

**/

public AnyLayer backgroundInAnim(@AnimRes int anim)

/**

  • 自定义背景的退出动画

**/

public AnyLayer backgroundInAnim(@NonNull Animation anim)

/**

  • 自定义背景的退出动画

**/

public AnyLayer backgroundOutAnim(@AnimRes int anim)

/**

  • 自定义背景的退出动画

**/

public AnyLayer backgroundOutAnim(@NonNull Animation anim)

/**

  • 默认浮层进入和退出动画时长

**/

public AnyLayer defaultContentAnimDuration(long defaultAnimDuration)

/**

  • 默认浮层进入动画时长

**/

public AnyLayer defaultContentInAnimDuration(long defaultInAnimDuration)

/**

  • 默认浮层退出动画时长

**/

public AnyLayer defaultContentOutAnimDuration(long defaultOutAnimDuration)

/**

  • 默认背景进入和退出动画时长

**/

public AnyLayer defaultBackgroundAnimDuration(long defaultAnimDuration)

/**

  • 默认背景进入动画时长

**/

public AnyLayer defaultBackgroundInAnimDuration(long defaultInAnimDuration)

/**

  • 默认背景退出动画时长

**/

public AnyLayer defaultBackgroundOutAnimDuration(long defaultOutAnimDuration)

/**

  • 设置背景为当前 activity 的高斯模糊效果

  • 设置之后其他背景设置方法失效,仅{@link #backgroundColorInt(int)}生效

  • 且设置的 backgroundColor 值调用 imageView.setColorFilter(backgroundColor)设置

  • 建议此时的{@link #backgroundColorInt(int)}传入的为半透明颜色

  • @param radius 模糊半径

**/

public AnyLayer backgroundBlurRadius(@FloatRange(from = 0, fromInclusive = false, to = 25) float radius)

/**

  • 设置背景为当前 activity 的高斯模糊效果

  • @param radius 模糊的百分比(相较于短边)

**/

public AnyLayer backgroundBlurPercent(@FloatRange(from = 0, fromInclusive = false) float percent)

/**

  • 设置背景高斯模糊的缩小比例

**/

public AnyLayer backgroundBlurScale(@FloatRange(from = 1) float scale)

/**

  • 设置背景图片

**/

public AnyLayer backgroundBitmap(@NonNull Bitmap bitmap)

/**

  • 设置背景资源

**/

public AnyLayer backgroundResource(@DrawableRes int resource)

/**

  • 设置背景 Drawable

**/

public AnyLayer backgroundDrawable(@NonNull Drawable drawable)

/**

  • 设置背景颜色

  • 在调用了{@link #backgroundBitmap(Bitmap)}或者{@link #backgroundBlurRadius(float)}方法后

  • 该颜色值将调用 imageView.setColorFilter(backgroundColor)设置

  • 建议此时传入的颜色为半透明颜色

  • @param colorInt 颜色值

**/

public AnyLayer backgroundColorInt(@ColorInt int colorInt)

/**

  • 设置背景颜色

**/

public AnyLayer backgroundColorRes(@ColorRes int colorRes)

/**

  • 设置浮层外部是否拦截触摸

  • 默认为 true,false 则事件由 activityContent 本身消费

**/

public AnyLayer outsideInterceptTouchEvent(boolean intercept)

最后

感谢您的阅读,在文末给大家准备一个福利。本人从事Android开发已经有十余年,算是一名资深的移动开发架构师了吧。根据我的观察发现,对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。

所以在此将我十年载,从萌新小白一步步成长为Android移动开发架构师的学习笔记,从Android四大组件到手写实现一个架构设计,我都有一一的对应笔记为你讲解。

当然我也为你们整理好了百度、阿里、腾讯、字节跳动等等互联网超级大厂的历年面试真题集锦。这也是我这些年来养成的习惯,一定要学会把好的东西,归纳整理,然后系统的消化吸收,这样才能极大的提高学习效率和成长进阶。碎片、零散化的东西,我觉得最没有价值的。就好比你给我一张扑克牌,我只会觉得它是一张废纸,但如果你给我一副扑克牌,它便有了它的价值。这和我们收集资料就要收集那些系统化的,是一个道理。

最后,赠与大家一句诗,共勉!

不驰于空想,不骛于虚声。不忘初心,方得始终。

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

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

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

名资深的移动开发架构师了吧。根据我的观察发现,对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。

所以在此将我十年载,从萌新小白一步步成长为Android移动开发架构师的学习笔记,从Android四大组件到手写实现一个架构设计,我都有一一的对应笔记为你讲解。

当然我也为你们整理好了百度、阿里、腾讯、字节跳动等等互联网超级大厂的历年面试真题集锦。这也是我这些年来养成的习惯,一定要学会把好的东西,归纳整理,然后系统的消化吸收,这样才能极大的提高学习效率和成长进阶。碎片、零散化的东西,我觉得最没有价值的。就好比你给我一张扑克牌,我只会觉得它是一张废纸,但如果你给我一副扑克牌,它便有了它的价值。这和我们收集资料就要收集那些系统化的,是一个道理。

[外链图片转存中…(img-bFwyKQoC-1715900455774)]

最后,赠与大家一句诗,共勉!

不驰于空想,不骛于虚声。不忘初心,方得始终。

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

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

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

  • 25
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是将普通的Fragment转换成DialogFragment用于显示自定义的Dialog的完整代码示例: 1. 自定义Dialog布局 在res/layout目录下创建一个名为dialog_my.xml的布局文件,用于定义自定义的Dialog的布局: ```xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="16dp" android:orientation="vertical"> <TextView android:id="@+id/dialog_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="18sp" android:text="My Dialog"/> <EditText android:id="@+id/dialog_input" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp"/> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:orientation="horizontal" android:gravity="end"> <Button android:id="@+id/dialog_cancel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Cancel"/> <Button android:id="@+id/dialog_ok" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="OK"/> </LinearLayout> </LinearLayout> ``` 2. 创建DialogFragment子类 创建一个继承自DialogFragment的子类MyDialogFragment: ```java public class MyDialogFragment extends DialogFragment { private EditText mInputEditText; public interface OnInputCompleteListener { void onInputComplete(String inputText); } public MyDialogFragment() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View view = inflater.inflate(R.layout.dialog_my, container, false); mInputEditText = (EditText) view.findViewById(R.id.dialog_input); Button cancelButton = (Button) view.findViewById(R.id.dialog_cancel); cancelButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dismiss(); } }); Button okButton = (Button) view.findViewById(R.id.dialog_ok); okButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { OnInputCompleteListener listener = (OnInputCompleteListener) getActivity(); if (listener != null) { listener.onInputComplete(mInputEditText.getText().toString()); } dismiss(); } }); return view; } @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { Dialog dialog = super.onCreateDialog(savedInstanceState); dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE); return dialog; } @Override public void onResume() { super.onResume(); Window window = getDialog().getWindow(); WindowManager.LayoutParams params = window.getAttributes(); params.width = WindowManager.LayoutParams.MATCH_PARENT; params.height = WindowManager.LayoutParams.WRAP_CONTENT; window.setAttributes(params); } } ``` 在onCreateView方法中,通过LayoutInflater将自定义的dialog_my布局文件解析为View,并添加点击事件处理。在onCreateDialog方法中,设置Dialog的样式。 3. 在Activity或Fragment中显示DialogFragment 在Activity或Fragment中,通过FragmentManager来显示MyDialogFragment,并实现OnInputCompleteListener接口: ```java public class MainActivity extends AppCompatActivity implements MyDialogFragment.OnInputCompleteListener { private TextView mInputTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mInputTextView = (TextView) findViewById(R.id.input_text); Button showDialogButton = (Button) findViewById(R.id.show_dialog_button); showDialogButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { MyDialogFragment dialogFragment = new MyDialogFragment(); dialogFragment.show(getSupportFragmentManager(), "MyDialogFragment"); } }); } @Override public void onInputComplete(String inputText) { mInputTextView.setText(inputText); } } ``` 在onInputComplete方法中,处理用户输入完成后的逻辑。 这样就可以将普通的Fragment转换成DialogFragment,并显示出自定义的Dialog了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值