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
и не будет распространять это событие.
Это сработало для меня. Надеюсь, это сработает и для вас.
Ссылка
у меня есть 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"
/>