Почему элемент реселлера должен дважды щелкнуть при использовании фокуса? - PullRequest
0 голосов
/ 20 сентября 2019

Я разрабатываю в Android с RecyclerView (GridView).Я хочу, чтобы у элемента был фон фокусировки по умолчанию, и при щелчке на нем был задан фон фокусировки.

Поэтому я установил макет элемента следующим образом:

<?xml version="1.0" encoding="utf-8"?>

<layout
        xmlns:android="http://schemas.android.com/apk/res/android">

    <data>
        <variable
                name="item"
                type="local.PaymentInfo" />
        <variable
                name="viewModel"
                type="local.PaymentViewModel" />
    </data>

        <RelativeLayout
                android:id="@+id/layout_payment_item"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:background="?android:attr/selectableItemBackground"
                android:focusable="true"
                android:clickable="true"
                android:focusableInTouchMode="true">

            <LinearLayout
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:orientation="vertical"
                    android:layout_centerInParent="true"
                    android:layout_marginTop="20dp">

                <ImageView
                        android:id="@+id/recharge_img"
                        android:layout_width="50dp"
                        android:layout_height="50dp"
                        android:contentDescription="@string/app_name"
                        android:src="@drawable/bd_ocr_close"
                        android:scaleType="fitCenter"/>

                <TextView
                        android:id="@+id/recharge_text"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:gravity="center_horizontal"
                        android:layout_gravity="center_horizontal"
                        android:text="@{item.name}"
                        android:layout_marginTop="10dp"
                        android:textSize="14sp" />

            </LinearLayout>
        </RelativeLayout>
</layout>

Макет имеет настройку фокуса ниже.

android:focusable="true"
android:clickable="true"
android:focusableInTouchMode="true"

И я хочу, чтобы у элемента был фокус по умолчанию, поэтому я установил фокус на элемент позиции 0 в viewHolder, как показано ниже.

class RechargeWayViewHolder(private val binding:ItemBinding,
                            private val viewModel: PaymentViewModel,
                            private val context:Context):RecyclerView.ViewHolder(binding.root) {


    fun bind(item: PaymentInfo, pos:Int){
        binding.viewModel = viewModel
        binding.item = item

        if(pos == 0){
            setItemSelect(item)
        }

        binding.layoutPaymentItem.setOnClickListener {
            setItemSelect(item)
        }
    }

    private fun setItemSelect(item: PaymentInfo){

        //set Item focus background
        binding.layoutRechargeItem.requestFocusFromTouch()
        binding.layoutRechargeItem.requestFocus()

        //set select Item
        viewModel.selectPaymentItem.value = item
    }
}

Код выше работаетотлично подходит для установки фокуса по умолчанию на элемент по умолчанию с позицией 0.

Situation 1 Но элемент setOnClickListener должен срабатывать при двойном щелчке.

Situation 2 Когда я удаляю следующее из xml.

android:clickable="true"
android:focusableInTouchMode="true"

Мне нужно только один раз щелкнуть по элементу, setOnClickListener сработает,Но в нем отсутствует фокус по умолчанию.Отображается только фон фокуса, когда я щелкаю элемент.

Я хочу, чтобы у элемента был фон фокуса по умолчанию (не использовать фоновое изображение), и не нужно дважды щелкать по элементу.

СделалЯ что-то пропустил?Заранее спасибо.

...