JetPack
ViewModel
How to use view binding in Android
There is a couple of things you should do and I try to make it organized and listed: (Based on Android Developers docs from this link and my personal experiences)
You need to use Android Studio 3.6 canary11+ (I'm currently using Android Studio 4 and it is doing the job well for me)
You can find it from here: https://developer.android.com/studio/archive
You need to upgrade your Gradle wrapper to Gradle "5.6.4" and Gradle build tool to "3.6.0-rc01", higher versions also work so don't be afraid to be updated
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip
dependencies {
... classpath 'com.android.tools.build:gradle:3.6.0-rc01'
}
- To enable view binding in a module, add the viewBinding element to its build.gradle file, as shown in the following example:
android {
...
viewBinding {
enabled = true
}
}
- If you want a layout file to be ignored while generating binding classes, add the
tools:viewBindingIgnore="true"attribute to the root view of that layout file:
<LinearLayout
...
tools:viewBindingIgnore="true" >
...
</LinearLayout>
If view binding is enabled for a module, a binding class is generated for each XML layout file that the module contains. Each binding class contains references to the root view and all views that have an ID. The name of the binding class is generated by converting the name of the XML file to camel case and adding the word "Binding" to the end.
For example, given a layout file called
result_profile.xml:
<LinearLayout ... >
<TextView android:id="@+id/name" />
<ImageView android:cropToPadding="true" />
<Button android:id="@+id/button"
android:background="@drawable/rounded_button" />
</LinearLayout>
The generated binding class is called ResultProfileBinding. This class has two fields: a TextView called name and a Button called button. The ImageView in the layout has no ID, so there is no reference to it in the binding class.
Every binding class also includes a getRoot() method, providing a direct reference for the root view of the corresponding layout file. In this example, the getRoot() method in the ResultProfileBinding class returns the LinearLayout root view.
- To set up an instance of the binding class for use with an activity, fragment or card view adapter perform the following steps:
- in the activity's onCreate() method:
private ResultProfileBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ResultProfileBinding.inflate(getLayoutInflater());
View view = binding.getRoot();
setContentView(view);
}
- in the fragments's onCreateView() method:
private FragmentHousesBinding binding;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
binding = FragmentHousesBinding.inflate(inflater, container, false);
init();
return binding.getRoot();
}
- in the card view adapter's onCreateViewHolder() method:
HouseCardPropertyFragmnetBinding binding;
@Override
public Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
binding = HouseCardPropertyFragmnetBinding.inflate(LayoutInflater
.from(parent.getContext()), parent, false);
return new Holder(binding);
}
@Override
public void onBindViewHolder(@NonNull HouseAdapter.Holder holder, int position) {
holder.bindData(getItem(position));
}
class Holder extends RecyclerView.ViewHolder {
HouseCardPropertyFragmnetBinding view;
Holder(@NonNull HouseCardPropertyFragmnetBinding v) {
super(v.getRoot());
view = v;
}
void bindData(Tag item) {
view.tagTxt.setText(item.Name);
}
}
that's it you are free from the findViewById from now on ;)
使用教程
一个变更:
- 面板使用控件不能使用xml,我写了很多xml需要在重写成动态布局
潜在风险:
其他开发如果也不清楚写了一些dp、xml、sp则会造成问题
ime-widgets的通用layout使用xml布局的layout则不能在面板端使用
对于整体更改缩放值提供方案
在面板、单手、悬浮中外层增加一个自定义ViewGroup专门处理measure 缩放操作(缩放处理横向、竖向、以及ResTag 处理业务定制scaleType)
类似于xml解析的时候将需要更改缩放的dp 设置为固定数值或者指定单位(15/15mp),然后在解析的时候统一处理缩放
劣势:
现在已经适配的缩放值,则需要去掉