Jetpack_0
优点:
加速开发,
消除样板代码,管理负责的任务 ,生命周期等,
高质量强大的应用。
新建NavigationActivity 查看BottomNavigationView 原理,页面搭建使用的是BottomNavigationView +fragment ,
fragment 中一个重要属性 defaultNavHost="true" 会判断回退栈中是否还有Fragment , true 会拦截返回键,否则会执行onBackPress();
fragment切换使用到了navigation 页面路由结构,资源文件中navigation文件夹,xml文件。
还可以在design中编辑xml文件, Arguments(创建当前Fragment需要传递的参数) Actions(跳转到写一个Fragment ,可以添加一些进出场动画)
DeepLinks(通过隐式意图跳转到相关页面)
DataBinding:
使用 DataBinding,在Model的build.gradle 的android { } 节点下添加
dataBinding{
enabled = true
}
编写布局文件 xml , 在根节点下 Alt +Enter 可直接生成 databing 格式的文件
变成 layout布局会自动生成一个名称对应的DataBinding对象。
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="feedTitle"
type="java.lang.String" />
<import type="android.text.TextUtils" />
<import type="android.view.View" />
</data>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="3"
android:paddingLeft="@dimen/common_padding_left"
android:paddingRight="@dimen/common_padding_right"
android:text="@{feedTitle}"
android:textColor="@color/color_2f2"
android:textSize="@dimen/sp_16"
android:visibility="@{TextUtils.isEmpty(feedTitle)?View.GONE:View.VISIBLE}"/>
</layout>
<data> 节点中 <variable> 中是自定义的属性和对应的 数据类
<import> 是引入会被使用的到的类
数据绑定方式:
text = "@{feedTitle}" // 或者 text = "@{author.name}"
图片的绑定方式不太一样
/**
* dataBinding 图片绑定
*/
public class PPImageView extends AppCompatImageView {
public PPImageView(Context context) {
super(context);
}
public PPImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public PPImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
/**
* dataBinding 提供用于绑定图片的注解
* value 对应一个数组,自定义属性
* requireAll = true ,表示 所有的属性都被调用才会绑定, = false 只要有一个属性就可以绑定数据
*
* @param view
* @param url
* @param isCircle
*/
@BindingAdapter(value = {"img_url", "isCircle"}, requireAll = false)
public void setImageUrl(ImageView view, String url, boolean isCircle) {
RequestBuilder<Drawable> builder = Glide.with(view).load(url);
// 是否圆形
if (isCircle) {
builder.transform(new CircleCrop());
}
// 防止 原始图片过大造成资源浪费 ;
ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
if (layoutParams != null && layoutParams.width > 0 && layoutParams.height > 0) {
builder.override(layoutParams.width, layoutParams.height);
}
builder.into(view);
}
}
在xml中引用
<com.bg.adopt.widgets.PPImageView
android:id="@+id/mAvatarIv"
android:layout_width="40dp"
android:layout_height="40dp"
app:img_url="@{author.avatar}"
app:isCircle="@{true}" />
如果在布局文件中想预览 一个 TextView , 可以添加 tools:text = "这里是预览", 不会运用到运行之后的效果。
dataBinding绑定数据不是立即执行的,都会延迟一帧,在绑定数据时有个屏幕刷新的工具类,会在下一帧执行,所以如果有的组件宽高不确定,需要运行时动态计算,推荐使用原生数据绑定方式。