Focus Listerner для нестандартного просмотра не запускается с первого раза - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть класс 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>

1 Ответ

0 голосов
/ 27 апреля 2020

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

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

    }
}


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

class MyView : View, View.OnFocusChangeListener {

    ...

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

    }
}


...