Когда следует использовать android: clickable?

когда мы должны использовать android:clickable в XML? Должны ли мы когда-нибудь?
Есть ли разница между такой декларацией XML и декларацией в коде myButton.setOnClickListener? Я прочитал документацию, но я не мог узнать, когда и почему я должен использовать этот атрибут.

PS. Я внедрял ad SDK и обнаружил, что их разработчики используют android:clickable с WebView и я был заинтригован, почему они используют его.

5 ответов


как говорится в документации, и насколько я знаю :

clickable - определяет, реагирует ли это представление на события щелчка. Должно быть логическим значением, либо "true", либо "false".

так, например, если вы просто объявляете Webview или View в своем layout.xml и попробуйте установить OnClickListener на это мнение OnClick событие не будет запущено, если вы не укажете атрибут:

  android:clickable=true

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

например, у меня есть FrameLayout что я показываю над базовым RelativeLayout в определенное время. Когда пользователь нажмет на базовый EditText фокус переместится на это EditText. Действительно раздражает, когда FrameLayout еще показывали. Теперь пользователь не знает, почему клавиатура просто выскочила или где они находятся напечатать.

когда я поставил clickable="true" на FrameLayout, пользователи больше не могли случайно щелкнуть базовый EditText поля.

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    ...>
    <EditText>
    <EditText>
    <EditText>
    <!-- FrameLayout with grayed-out background. -->
    <FrameLayout
        android:id="@+id/sometimes_visible_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#80808080"
        android:clickable="true"
        android:visibility="gone"
        android:focusable="true"
        ...>
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            ...>
            <View>
            <View>
        </LinearLayout>
    </FrameLayout>
</RelativeLayout>

при установке view.setOnClickListener любой View, например: myButton.setOnClickListener(new OnClickListener) по умолчанию считается as clickable="true".

поэтому вам не нужно будет упоминать, что в XML-файле, как android:clickable="true". The onClick() событие будет запущено без использования android:clickable="true".


я испытал ситуацию, когда я сделал активность swipeable (проведите влево/вправо или вправо/влево, чтобы двигаться вперед/назад). На некоторых экранах были места, которые были заполнены только LinearLayout. Нет OnClickListener для макета (это не было необходимо), в результате чего действие салфетки не регистрируется при выполнении на LinearLayout. Установка android:clickable="true" решена проблема.

чтобы ответить на ваши вопросы и как выше показано, есть ситуации, в которых использование the clickable-атрибут может быть полезным.

Я не верю, что вы можете сказать, что задание OnClickListener Это то же самое, что и установка clickable-атрибут, но задание OnClickListener безусловно, делает View клики, что делает clickable-атрибут бесполезен (в этой конкретной ситуации).


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

Я создал свой собственный "контроль", и я хотел, чтобы он был кликабельным, поэтому мне пришлось его использовать.

Это один сценарий, если вы будете использовать его