Android: разрешить пользователю настраивать пользовательский интерфейс - PullRequest
0 голосов
/ 19 января 2019

Я хочу, чтобы пользователь мог настраивать пользовательский интерфейс приложения, например, позволяя пользователю настраивать форму изображения профиля в виде кругов или квадратов.Каков наилучший способ добиться этого?

  • Я бы хотел избежать двух файлов макетов, которые будут содержать большинство общих элементов, и раздувать их в зависимости от настроек, поскольку это будет означать изменение одного и того же элемента дваждыв будущем.
  • Я хочу использовать привязку данных, если это возможно.Например.Установка значения переменной в файле XML в зависимости от настройки и включение правильного макета профиля профиля в зависимости от этой переменной.

1 Ответ

0 голосов
/ 20 января 2019

После более чем недели настойчивых попыток я придумал элегантное решение:

В 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

Предложения приветствуются!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...