android - Android:允许用户自定义 UI
问题描述
我希望用户能够自定义应用程序的 UI,例如允许用户将个人资料图片的形状配置为圆形或正方形。实现这一目标的最佳方法是什么?
- 我希望避免拥有两个布局文件,它们将具有大多数共同的东西,并根据设置对它们进行膨胀,因为这意味着将来要更改相同的东西两次。
- 如果可能,我想使用数据绑定。例如。根据设置在 XML 文件中设置变量的值,并根据该变量包括正确的配置文件图片布局。
解决方案
经过一个多星期的坚持尝试,我想出了一个优雅的解决方案:
在 XML 中,我使用了数据绑定:
<data>
<variable
name="shape"
type="chat.rocket.android.helper.Constants"/>
</data>
...
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/image_avatar"
android:layout_width="40dp"
android:layout_height="40dp"
app:roundedCornerRadius='@{shape.AVATAR_SHAPE_CIRCLE ? @dimen/circle_avatar_corner_radius : @dimen/square_avatar_corner_radius}' />
由于roundedCornerRadius
没有对应的 setRoundedCornerRadiusIn BindingAdapters.kt
,
@BindingAdapter("roundedCornerRadius")
fun setRoundedCornerRadius(view: SimpleDraweeView, height: Float) {
val roundingParams = RoundingParams.fromCornersRadius(height)
view.hierarchy.roundingParams = roundingParams
}
该Constants.kt
文件具有可以配置为更改形状的常量:
object Constants {
...
const val AVATAR_SHAPE_CIRCLE = true
}
在RecyclerViewAdapter
,
...
val layoutInflater = LayoutInflater.from(parent.context)
val binding: ViewDataBinding = DataBindingUtil.inflate(layoutInflater, R.layout.item_contact, parent, false)
ContactViewHolder(binding.root)
...
这是我能想到的最好的解决方案。如果有一种方法可以根据shape.AVATAR_SHAPE_CIRCLE
. 例如。
if(shape.AVATAR_SHAPE_CIRCLE)
apply these attr
else
apply these attr
欢迎提出建议!
推荐阅读
- amazon-ec2 - 我想在我的 AWS EC2/PM2 上找到 POST API 调用的主体
- java - 更新时间时进度条停止或滞后
- java - Firebase Firestore:防止Android-Java日期范围内的双重预订
- c - 虽然循环没有到达链表的末尾
- java - 在android studio中的多个if条件中循环
- android - API 21 中出现屏幕外的 Android 对话框
- c# - 在 Visual Studio 中使用基本 C# if/else 语句时遇到问题
- r - 不能用 rvest 刮桌子
- excel - 从 Excel 或 VBA 中的部分月还款开始计算本金支付 (PPMT)
- sql - 如何在查询中为 sys 数据库使用数据库名称?