Seekbar фокус не хотел

Я использую SeekBar в моем макете, и у меня есть другой вид, который является RelativeLayout.

<CoordinatorLayout>

    <RelativeLayout>
    ...
    </RelativeLayout>

    <SeekBar
        android:id="@+id/progressSeekBar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:progress="70"
        android:progressDrawable="@drawable/player_seek_bar_progress"/>

</CoordinatorLayout>

И когда я касаюсь этого RelativeLayout, SeekBar получает фокус... Я не нахожу никаких проблем в моем макете, даже в моем коде...

У кого-то есть такая же проблема?

Спасибо ребята за ваши ответы:)

6 ответов

У меня точно такая же проблема. Мой макет выглядит примерно так (я опустил нерелевантные представления для этой темы). Как вы можете видеть, как родительское представление (LinearLayout) и SeekBar иметь android:clickable="true" имущество.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:clickable="true"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <SeekBar
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:clickable="true" />
</LinearLayout>

Как это решить?:]

Вот что я нашел в исходном коде для #android.view.ViewGroup#dispatchSetPressed (это событие вызывается каждый раз, когда пользователь касается экрана)

Он просматривает каждое дочернее представление и, если оно соответствует следующему условию, передает событие этому дочернему представлению:

if (!pressed || (!child.isClickable() && !child.isLongClickable())) {  
  child.setPressed(pressed); 
}

В основном, если ваш ребенок рассматривает (в этом случае, SeekBar либо кликабелен, либо кликабелен долго, вы не будете распространять событие на него. Кроме того, есть комментарий, который говорит следующее:

Дочерние объекты, на которые можно нажимать самостоятельно, не должны показывать нажатое состояние, когда их родительское представление показывает. Очистка нажатого состояния всегда распространяется.

Ситуация, описываемая в этом комментарии, такая же, как и сейчас. Если вы установите SeekBar Андроид знает, что он реагирует на клики и должен реагировать на события клика непосредственно в SeekBarи не будет распространять это событие.

Это сработало для меня. Надеюсь, это сработает и для вас.

Ссылка

ViewGroup исходный код

у меня есть SeekBar внутри моего FrameLayout. Я сделал это программно, и у меня это сработало:

      seekbar.isClickable = true
mSeekBar = (SeekBar) v.findViewById(R.id.progressSeekBar);
mSeekBar.setFocusable(false);

Вы пробовали программно установить свой SeekBar? Мне показалось, что это работает, но установка атрибута XML на android:focusable="false" не.

Просто поместите это в представление root и удалите все кликабельные в root

android:descendantFocusability="blocksDescendants"
<SeekBar
    android:id="@+id/progressSeekBar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:progress="70"
    android:progressDrawable="@drawable/player_seek_bar_progress"
    android:focusable="false"/>

Просто установите android:clickable="true" а также android:focusable="true"как атрибуты SeekBar XML. После этого SeekBar не будет фокусироваться при нажатии на родительский макет.

Кредиты для @Kashmir

    <SeekBar
            android:id="@+id/seekBar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"

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

            />
Другие вопросы по тегам