Android自适应布局解决方案
Android UI自适应解决方案
前言
因为之前一直使用的鸿洋的AndroidAutoLayout(貌似目前停止维护了),所以对这种模式的自适应方案比较认同。但是我是一个JetBrains的粉丝,在学习Anko的时候发现这套方案不适用了,于是打算自己来实现一套。
最终形成的这套方案特点如下:
- 使用Kotlin开发(顺便推广一下,用了Kotlin之后,基本上不会再喜欢写java的代码了)
- 超低侵入性(不需要继承Activity,不需要改变之前的layout文件,只需要依赖+配置meta)
- 插拔式组件
- 并同时支持普通的layout模式和Anko模式
另外,如果本文读起来有任何不顺畅或者不合理的地方,也请帮忙提出来,感谢!
如何使用
Step1
repositories {
...
maven { url 'https://jitpack.io' }
}
Step2
dependencies {
...
compile 'com.github.nobeginning.AdaptiveAnkoComponent:adaptive-anko:v0.4.0'
compile 'com.github.nobeginning.AdaptiveAnkoComponent:adaptive:v0.4.0'
}
Step3
In AndroidManifest.xml
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme.NoActionBar">
<meta-data
android:name="com.young.adaptive.designWidth"
android:value="720" />
<activity></activity>
</application>
In layout xml:
直接以px为单位按照设计稿即可
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="AutoSized List Title"
android:textSize="30px"/>
Step4
In Activity:
AdaptiveAssistant().setContentView(this, R.layout.activity_xxx)
In Adapter:
......
val layoutAssistant = LayoutAssistant()
......
override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
val view = convertView ?: layoutAssistant.adaptive(this@NormalActivity, parent ,R.layout.cell_for_list)
view.tvTitle.text = "Title -> ${
getItemId(position)}"
view.tvDesc.text = "Description -> ${
getItemId(position)}"
return view
}
详解
图解
代码及思路介绍
主要类的介绍
AdaptiveAssistant
自适应入口,提供了基于Activity和Adapter的自适应方法
AdaptiveComponent
内部维护了一个IComponent链表,用以管理自适应组件,同时对外暴露了管理组件的add及remove方法,便于使用者自己扩展
IComponent
抽象出的自适应组件接口
AdaptiveLayoutContext
核心类,用于处理自适应逻辑
AdaptiveViewManager
用于Anko的支持,待优化
核心思路
先看一下Activity的setContentView最终实现:
@Override
public void setContentView(View v) {
ensureSubDecor(