Focus Listerner для пользовательского представления не запускается в первый раз

У меня есть класс Custom View, поэтому для всего представления мне нужно проверить состояние фокуса, чтобы увидеть, сфокусировано оно или нет.

Что я пробовал

использовал обратный вызов setOnFocusChangeListener { } для проверки сфокусированного состояния.

  • Проблема здесь в том, что этот обратный вызов не запускается в первый раз и еще несколько раз, и поведение при запуске обратного вызова не соответствует.
  • Я даже установил атрибуты focusable=true, focusIntouchMode = true для представления.

Пожалуйста, предоставьте некоторые данные на случай, если я что-то упустил здесь. Спасибо

Вот код

   CarouselCardView constructor(context) : CustomWidget(context),ViewPager.OnPageChangeListener {

private var currentPage = 0

override fun getLayoutId(): Int {
    return R.layout.banner
}

init {
    isFocusable = true
    isFocusableInTouchMode = true
}

private fun setViewpagerAutoAdvanceFeature(
    modelData: List<ContentData>
) {
    //Auto scroll logic goes here
}

override fun bindData(modelData: List<ContentData>) {

    val pagerAdapter = HeroPagerAdapter(context, model = modelTV,
        onClickItem = { position ->
            clickListener.onItemSelected(uiComponent, uiComponent.componentItems[position])
        },
        onLastItemReached = { viewPager.setCurrentItem(0, true) })
    viewPager.adapter = pagerAdapter
}

//Call backs don't trigger 
setOnFocusChangeListener { v, hasFocus ->
    if (hasFocus) {
        Log.e("ANI","On setOnFocusChangeListener showing")
    } else {
        Log.e("ANI","On setOnFocusChangeListener not showing")

    }
}

Вот макет для справки

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/heroBanner"
    android:background="@drawable/bg_transparent">

    <androidx.viewpager.widget.ViewPager
        android:id="@+id/viewPager"
        android:layout_width="@dimen/grid_900"
        android:layout_height="@dimen/grid_380"
        android:fitsSystemWindows="true" />

    <com.google.android.material.tabs.TabLayout
        android:id="@+id/indicator"
        android:layout_width="@dimen/grid_900"
        android:layout_height="@dimen/grid_1"
        android:layout_alignBottom="@+id/viewPager"
        app:tabBackground="@drawable/btn_selector"
        android:layout_gravity="center_horizontal"
        android:background="@android:color/transparent"
        android:layout_marginBottom="@dimen/margin_bottom_line_indicator"
        app:tabIndicatorHeight="0dp"
        app:tabGravity="center" />
</RelativeLayout>

person Anirudh Goud    schedule 27.04.2020    source источник
comment
какое представление использует функцию setOnFocusListener?   -  person NullByte08    schedule 27.04.2020
comment
@ NullByte08 Я добавил макет, пожалуйста, проверьте, поэтому в этом случае я хочу, чтобы он был для всего представления. рассмотрим heroBanner для рута   -  person Anirudh Goud    schedule 27.04.2020


Ответы (1)


Я сделал собственное представление и попытался вызвать setOnFocusChangeListener в классе представления, как вы указали в вопросе. но после вызова setOnFocusChangeListener как

setOnFocusChangeListener { v, hasFocus ->
    if (hasFocus) {
        Log.e("ANI","On setOnFocusChangeListener showing")
    } else {
        Log.e("ANI","On setOnFocusChangeListener not showing")

    }
}


Студия Android выдает ошибку и говорит: «Ожидается объявление члена». но я мог бы добиться этого, внедрив OnFocusChangeListener следующим образом

class MyView : View, View.OnFocusChangeListener {

    ...

    override fun onFocusChange(v: View?, hasFocus: Boolean) {

    }
}


person Reza    schedule 27.04.2020
comment
Я попробовал ваш способ добавить его, такое же поведение для меня не работает в первый раз - person Anirudh Goud; 27.04.2020
comment
пожалуйста, проверьте эту ссылку stackoverflow.com/a/18278663/8136868 Я думаю, вам следует реализовать onfucuschangelistener, где вы собираетесь использовать свой Посмотреть. как кнопки, которые вы определяете для своих прослушивателей кликов в действиях или фрагментах (где они используются, а не там, где они определены) - person Reza; 27.04.2020