还是回到我们前面的问题,如果需要注入的成员是 private,ButterKnife 会报错,显然,如果 title 是 private,生成的代码中又写到 target.title,这不就是在搞笑么?...在这里,所有的输入就是我们在自己的代码中配置的注解,所有的输出,就是生成的用于注入对象的辅助代码。...不不不,是添加一组注入关系,后面生成代码时,注解管理器就需要根据这些解析来的关系来组织生成的代码。所以,要不要再看一下生成的代码,看看还有没有新的发现?...4、AndroidAnnotations 和 Dagger2 4.1 AndroidAnnotations AndroidAnnotations 同样是一个注入工具,如果你稍微接触一下它,你就会发现它的原理与...从使用的角度来说,ButterKnife 只是针对 UI 进行注入,功能比较单一,而 AndroidAnnotations 真是有些庞大和强大,究竟使用哪一个框架,那要看具体需求了。
对于非Activity中可以使用ButterKnife.inject(this, view);来进行注入操作。...除此之外呢,RoboGuice渗透到开发中的很多方面,例如它支持 (1)在TestCase中使用注入 (2)在自定义的View中使用注入 (3)在context-based events中使用注入...当然啦,这自然不是RoboGuice最大的亮点啦,我个人认为最大的亮点是对POJO的注入,就像Spring的依赖注入一样简单才行嘛。...如下所示,Foo类的对象foo会被自动注入,所以我们就能够直接使用。...对于Android Annotations的功能,它基本上覆盖了Butter Knife和RoboGuice中的所有主要功能,详细的功能列表参见这里。
4.对所应用的Activity或其他类,在配置文件AndroidManifest.xml中,进行后缀的下划线添加 ?...MyOtherClass myOtherClass; } 也可以用来声明接口: @Bean(MyImplementation.class) MyInterface myInterface; 在普通类中还可以注入根环境...,不要在oncreate()中设置,因为oncreate()在执行时 view还没有注入 myTextView.setText("Date: " + new Date()); }[.....Click @Click(R.id.myButton) void myButtonWasClicked() { [...] } @Click void anotherButton() {//如果不指定则函数名和...void onResult(Intent data) { } @OnActivityResult(ANOTHER_REQUEST_CODE) void onResult() { } 以上的注释用法基本包含了平常程序中的事件绑定
###第一部分 Unit Tests Unit Test又叫JVM Tests 或者Local Tests,就是指直接运行在Java虚拟机而不是Dalvik虚拟机中的测试。...,并采用了Android Annotation注解注入Context。...(5)运行测试有两种方式,可以简单地和运行普通程序一样点击Run按钮,结果会显示在下面的Run视图窗口中,也可以在终端运行....前者只运行当前测试的运行参数中配置的测试类和方法,而后者会检测整个项目中的所有Unit Test并进行测试。 上面四个测试中只有前三个是通过的,最后一个没能通过。...(最后一个测试方法的问题出在ObjectOutputStream对象创建的时候,因为当前处于Unit Test中,没有设备或者模拟器所以没法直接写文件,对于这类特殊的测试就不能使用Unit Test,而是使用第二节中的
2.1 FragmentManager相关 1. getFragmentManager(): 获取Fragment父容器的管理器,但是现在该方法在Activity中已经被标记不推荐使用了。...不会随着activity一起被销毁(但会销毁fragment的视图); 相反,它会一直保留(进程不消亡的前提下),并在需要时原封不动地传递给新的Activity。...答案是可以的,但是不推荐。...false,这个false的意思是:不递归碎片中的碎片了,就是碎片栈中的碎片' 10....其实这个本来也想多写点,但是我估计这个基本安卓开发都使用过,所以就直接用网上其他作者的基础介绍文章: Android 必知必会 - DialogFragment 使用总结 同时具体的自定义DialogFragment
动画等:lottie or svga or pag不过本篇不教大家如何使用该框架功能。因为单一的工具并非框架重点功能。其他:core-ktx,lifecycle,androidx系列库等。...依赖注入:hilt(可选),依赖注入是否需要使用,取决于预估的项目规格大小,本篇抛砖引玉,会带入一点hilt的使用,不过并非重点,可酌情选取使用。...基础存储:mmkv(可选),由于room有一定的性能问题,所以性能优化后的部分常用键值对可以选用mmkv使用。bug采集:bugly 本篇不接入,正式项目可选取合适自己的采集工具。埋点采集:同上。...///////// // android androidCoreKtx : 'androidx.core:core-ktx:1.9.0', androidAnnotations...,例如app.gradle中引入dependencies { implementation rootProject.ext.deps.androidCoreKtx implementation
本文的主要内容 DialogFragment 是什么 创建通用的 CommonDialogFragment 实现各种类型的 DialogFragment 在写正文之前,先来一波效果展示吧 ?...1、DialogFragment 的优点 其实在 Android 中显示对话框有两种类型可供使用,一种是 DialogFragment,而另一种则是 Dialog。...进行封装,依赖外部传入的 AlertDialog 来构建,同时也处理了 DialogFragment 中 AlertDialog 不能设置外部取消的问题 public class CommonDialogFragment...= null){ mCancelListener.onCancel(); } 这便是我们在构造函数中传入 OnCancelListener 的原因,当我们想要做一些取消对话框后的处理时,只要在构造函数中传入...--不设置在6.0以上会出现,宽度不充满屏幕的情况--> 90% <!
View注入的目的。...不过比较遗憾的是你不能修改已经存在的Java文件,比如在已经存在的类中添加新的方法,所以通过Java Annotation Tool只能通过辅助类的方式来实现View的依赖注入,这样会略微增加项目的方法数和类数...那么通过getOrCreateBindingBuilder方法生成或者直接从targetClassMap中获取(为了提高效率,生成的BindingSet.Builder会被存储在targetClassMap...MainActivity一般会调用ButterKnife.bind(this)来实现View的依赖注入,这个也是ButterKnife和Google亲儿子AndroidAnnotations的区别:AndroidAnnotations...不需要自己手动调用ButterKnife.bind(this)等类似的方法就可以实现View的依赖注入,但是让人蛋疼的是编译的时候会生成一个子类,这个子类是使用了AndroidAnnotations类后面加了一个
DialogFragment隐藏导航栏 在 Android 中,使用 DialogFragment 显示对话框时,如果您希望隐藏系统导航栏(如状态栏和导航键),可以通过设置相关的系统 UI 标志来实现。...这需要在 DialogFragment 的视图创建和显示过程中配置窗口属性。...以下是一个完整的例子,展示了如何在 DialogFragment 中隐藏系统导航栏(使用 Kotlin): import android.os.Bundle import android.view.View...onViewCreated: 在视图创建后设置系统 UI 可见性标志,隐藏导航栏和状态栏。 onStart: 设置对话框窗口的布局参数,使其覆盖整个屏幕。...") 小结 通过在 DialogFragment 的 onViewCreated 方法中设置系统 UI 的可见性标志,可以实现隐藏系统导航栏的效果。
hi,在项目开发中,有时候需要仿照ios的底部弹框做效果,比如我们在iPhone上面关闭定位的时候,就会弹出ios特有的底部弹框: ?...2 实现弹框: 因为后来谷歌推荐使用的DialogFragment,所以我们此处弹框也是使DialogFragment。...标题内容的上方有一块区域 我们弹框布局的底部的背景色默认是灰色 我们针对这二个先做处理: 其实我们上方的一块区域是弹框的标题, 我们在IOSDialogFragment中添加: ?...PS:这里还有另外一种方法,不写这句decorView.setPadding(0,0,0,0);而是直接设置window的背景颜色,window.setBackgroundDrawable(new ColorDrawable...,会直接dismiss,而不走我们的方法: ?
01 概述 DialogFragment是在Android 3.0的时候被引入的, 目的是dialog也变成了碎片。DialogFragment是Fragment的子类,用于创建于用户交互的对话框。...在DialogFragment未哇哇坠地之前,我们一般用AlertDialog和Dialog来创建对话框。现在,谷歌官方不建议直接使用Dialog创建对话框。...在示例samples-23_r02\content\webview\PermissionRequest中, 谷歌官方建议我们的对话框内能提供newInstance()的方法。...最简单、最方便的方法是利用Java的接口回调机制,在DialogFragment类中定义一个回调接口, Activity(Framgent)实现该接口。 在DialogFragment类中 ?...在Activity(Framgent)类中 ?
Fragment可以协助我们完成如下任务: 1、在一个页面中嵌入多个连续可翻页的子视图,方面使用ViewPager统一管理; 2、开发一些通用的小部件,内部封装好代码逻辑,可直接嵌入到任意页面。...虽然原理类似,但是Fragment比起自定义控件有如下优势: 1、自定义控件内部一般不直接处理业务逻辑,相反Fragment经常处理业务逻辑; 2、自定义控件生成画面后,要再更新该控件画面,只能从外部...onCreateView : 创建Fragment的视图,在onCreate之后调用。...Fragment的子类 Android还给Fragment设计了几个子类,分别用在某些特殊的场合,具体说明如下: DialogFragment : 用于对话框的碎片。...参见《Android开发笔记(二十三)文件对话框FileDialog》,对话框页面逻辑要写在onCreateDialog方法中,另外DialogFragment也实现了Dialog的常见方法。
接着创建一个AlertDialog.Builder对象,在该Builder对象中嵌入布局视图,并设置标题、确定按钮、取消按钮。...最后还要提供一个回调接口,用于主页面上处理日期和时间的选择事件,同时在确定按钮的点击事件中要触发该回调接口的方法。...再次重写onCreateDialog方法,往对话框界面上添加具体的视图布局,这里的视图布局可从xml文件中获取,也可在代码中一个个添加。...最后便是在主页面中调用自定义的提示对话框。...当然不要忘了在主页面的回调方法中对选定文件做具体处理,文件打开之后要如何读取数据,又要如何把内存中的数据保存到文件中。 下面是文件打开对话框与文件保存对话框的页面截图: ? ?
在DialogFragment产生之前,我们创建对话框:一般采用AlertDialog和Dialog。注:官方不推荐直接使用Dialog创建对话框。...MainActivity中需要实现我们的接口LoginInputListener,实现我们的方法,就可以实现当用户点击登陆时,获得我们的帐号密码了: c) MainActivity package...6、DialogFragment做屏幕适配 我们希望,一个对话框在大屏幕上以对话框的形式展示,而小屏幕上则直接嵌入当前的Actvity中。这种效果的对话框,只能通过重写onCreateView实现。...,如果是大屏幕则直接以对话框显示,如果是小屏幕则嵌入我们的Activity布局中 这个R.bool.large_layout是我们定义的资源文件: 在默认的values下新建一个bools.xml DialogFragment实现的对话框则可以完全不必考虑旋转的问题。
虽然被杀死了,但是onCreate函数在执行的时候还是只执行了一次啊,为什么会出现两个DialogFragment,这里其实就有一个DialogFragment是通过Android自身的恢复重建机制重建出来...在恢复的时候,会被自动创建,并且采用Fragment的默认无参构造方法,如果没哟这个方法,就会抛出InstantiationException异常,这也是为什么第二个例子中会出现崩溃的原因。...为什么出现两个DialogFragment Fragment在被创建之后,如果不通过add或者replace添加到Activity的布局中是不会显示的,在保存现场的时候,也是保存了add的这个状态的,来看一下...这样,在FragmentActivity调用onStart函数之后,会新建mAdded列表中Fragment的视图,将其添加到相应的container中去,并在Activity调用onReusume的时候...如果没有被异常杀死,不走Activity的恢复新建流程,也就不会回调OnRestoreInstanceState,简单看一下Activity的加载流程图: onRestoreInstance调用时机.png
2.1 FragmentManager相关 1. getFragmentManager(): 获取Fragment父容器的管理器,但是现在该方法在Activity中已经被标记不推荐使用了。...不会随着activity一起被销毁(但会销毁fragment的视图); 相反,它会一直保留(进程不消亡的前提下),并在需要时原封不动地传递给新的Activity。...答案是可以的,但是不推荐。...false,这个false的意思是:不递归碎片中的碎片了,就是碎片栈中的碎片' 复制代码 10....其实这个本来也想多写点,但是我估计这个基本安卓开发都使用过,所以就直接用网上其他作者的基础介绍文章: Android 必知必会 - DialogFragment 使用总结 同时具体的自定义DialogFragment
不让显示Title部分,关键点2就是常用的setContentView,关键点3根4就是为了全屏对话框做的修改,关键点4必须要放在setContent的后面,因为如果放在setContent该属性会被冲掉无效...针对DialogFragment的实现方式 Android比较推荐采用DialogFragment实现对话框,它完全能够实现Dialog的所有需求,并且还能复用Fragment的生命周期管理,被后台杀死后还能自动恢复...默认采用的是MATCH_PARENT,但是如果windowIsFloating 被设置为True,WindowManager.LayoutParams参数中的尺寸就会被设置成WRAP_CONTENT,具体源码如下...不设置Window.FEATURE_NO_TITLE 在上面的分析中我们知道,setContentView会进一步调用generateLayout创建根布局,Android系统默认实现了多种样式的根布局应...(不兼容5.0以下),主题中添加如下属性,设置状态栏颜色透明即可,当然,代码中也可实现。
c)谷歌的官方不建议使用ProgressDialog,这里我们会使用官方推荐的DialogFragment来创建我的加载框,如果你不了解:请看 Android 官方推荐 : DialogFragment...这样,其实给我们带来一个很大的问题,DialogFragment说白了是Fragment,和当前的Activity的生命周期会发生绑定,我们旋转屏幕会造成Activity的销毁,当然也会对DialogFragment...当Android系统因为配置变化关闭你的Activity的时候,你的Activity中被标识保持的fragments不会被销毁。...你可以在你的Activity中添加这样的fragements来保存有状态的对象。...事实上,如果我关闭了,上一次的对话框会一直存在;如果我不关闭,但是activity是一定会被销毁的,对话框的dismiss也会出异常。
ViewBinding 是 Android Gradle Plugin 3.6 中新增的特性,用于更加轻量地实现视图绑定(即视图与变量的绑定),可以理解为轻量版本的 DataBinding。...ViewBinding 是 Android Gradle Plugin 3.6 中新增的特性,用于更加轻量地实现视图绑定(即视图与变量的绑定),可以理解为轻量版本的 DataBinding。...2.1 添加配置 视图绑定功能按模块级别启用,启用的模块需要在模块级 build.gralde 中添加配置。例如: build.gradle android { ......答:Activity 实例和 Activity 视图的生命周期是同步的,而 Fragment 实例和 Fragment 视图的生命周期并不是完全同步的,因此需要在 Fragment 视图销毁时,手动回收绑定类对象...DESTROYED,说明视图被销毁,此时不缓存绑定类对象(避免内存泄漏) } else { // 4.2 定义视图生命周期监听者 lifecycle.addObserver
$set(this.obj,'key','value') 方案三:利用Object.assign({},this.obj)创建新对象 Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象