onClick не запускается в LinearLayout с дочерним элементом

У меня есть собственный LinearLayout с меньшим дочерним элементом TextView. Я хотел бы иметь возможность щелкнуть область, не охваченную TextView, поэтому я установил clickable = true и onclicklistener для LinearLayout, но onClick не запускается. Если я установлю прослушиватель onclick в TextView, он будет работать так, как ожидалось ...

Кто-нибудь может помочь?

ar_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ar_item" android:layout_width="202dp"
    android:layout_height="62dp" android:background="@drawable/bg_item_ar"
    android:clickable="true">

    <TextView android:id="@+id/ar_item_txt"
        android:layout_width="164dp" android:layout_height="fill_parent"
        android:paddingBottom="8dp" android:paddingLeft="8dp"
        android:paddingTop="8dp" android:paddingRight="6dp" android:gravity="center"
        android:background="#50000000" />

</LinearLayout>

Мой собственный LinearLayout

public class ARView extends LinearLayout
{    

    public ARView(final Context context, String name, String id)
    {        
        super(context);  
        getLayoutInflater().inflate(R.layout.ar_item, this ,true);
        LayoutInflater inflater = (LayoutInflater)   getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
        inflater.inflate(R.layout.ar_item, null);

        TextView textView = (TextView) findViewById(R.id.ar_item_txt);
        textView.setText(name);

        setOnClickListener(new View.OnClickListener()
        {
            public void onClick(View v)
            {                   
                Toast t = Toast.makeText(context, "hey!", Toast.LENGTH_SHORT);
                t.show();
            }
        });
    }
}

person jul    schedule 20.07.2011    source источник
comment
У меня такая же проблема, вы нашли решение?   -  person longhairedsi    schedule 31.08.2011


Ответы (14)


для каждого ребенка

android: duplicateParentState = "true"

person Blackbelt    schedule 08.11.2011
comment
Спасибо за это, я решил мою аналогичную проблему наличия нескольких элементов управления, которые я хочу отображать визуальное состояние щелчка, при этом мне нужно обрабатывать событие только в родительском элементе. - person Rollie; 14.07.2012
comment
Хотя я все еще вижу одну очень странную проблему - когда у меня есть clickable = true, width / height = wrap / match, это работает, но если я помещаю их в стиль и использую этот стиль, это не так (нет визуального щелчка состояние, обработчик не уволен). Это на 2.3; есть идеи, почему это может происходить? - person Rollie; 14.07.2012
comment
Спасибо за это! Решена проблема, с которой я столкнулся сегодня с выбором вложенного линейного макета. - person my code smells; 21.06.2013
comment
@Blackbelt Здесь, в этом сценарии, я должен поместить этот android: duplicateParentState = true? внутри Linear Layout или Text View. - person Jay Rathod RJ; 09.12.2016
comment
@jaydroider для детей LL, поэтому TextView, я полагаю - person Blackbelt; 09.12.2016
comment
Подоконник нужно установить каждому дочернему андроиду: clickable = false - person Vishal G. Gohel; 23.12.2017
comment
Это не всегда работает .... обратитесь к этому ... stackoverflow.com/a/31578111/5886712 ... или примените ниже это к дочернему ›android: clickable = false - person Tarit Ray; 03.04.2019

android:duplicateParentState="true" мне не помогло.

Чтобы сделать макет интерактивным вместе с дочерними элементами, необходимо добавить этот параметр для каждого дочернего элемента:

 android:clickable="false"

Затем обработка кликов перейдет вверх к родительскому.

person Yurets    schedule 23.07.2015
comment
Спасибо @Yurets, это работает как по волшебству. это должен быть приемлемый ответ - person Vishal G. Gohel; 23.12.2017
comment
Спасибо. У меня тоже сработало! - person Yesha; 06.08.2018
comment
Ага - сработало. Моя проблема заключалась в том, что мои дети были кнопками (по сути, интерактивными), поэтому мне пришлось изменить их на ImageViews. Я не знаю, почему они у меня вообще были кнопками. - person JCutting8; 03.09.2018
comment
Что делать, если в макете должны быть дочерние элементы, которые можно нажимать ??? - person ekashking; 07.06.2021
comment
тогда вы пропустите настройку android:clickable="false" для этих детей. @ekashking - person Yurets; 07.06.2021

Это не ваш случай, но у меня была аналогичная проблема с кликабельным ViewGroup. После часа поиска решения выяснилось, что я установил android:inputType на TextView внутри моего ViewGroup, который блокировал onClick() слушателя (не знаю почему)

Не используйте android:inputType с TextView

person elementstyle    schedule 16.07.2016
comment
благодарю вас! Я не мог понять, почему мой TextView перехватывает клики. - person MrPlow; 02.09.2016
comment
Это тоже была моя проблема, убедитесь, что у вас нет inputType или для него установлено значение none! Спасибо, что разместили это - person Adam William Larson; 02.06.2017
comment
ну, у меня ничего не работало, если я не встретил ваш ответ, для моего текстового представления был тип ввода. - person Usama Saeed US; 02.02.2020

Сделайте свой родительский LinearLayout android: clickable = "true"

Сделайте все дочернее представление android: clickable = "false"

В разделе Linearlayout - удалите android: inputType = "" из TextView.

person Ahamadullah Saikat    schedule 10.12.2017

android:duplicateParentState="true" сделал мой TextView отключенным и не мог получить событие клика.

Все, что вам нужно, это установить TextView clickable="false". Таким образом, событие click будет отправлено в родительский макет, а TextView по-прежнему может реагировать на событие касания (с эффектом пульсации).

person nhoxbypass    schedule 23.07.2017

Высота TextView покрывает весь родительский элемент (весь макет), поэтому вы можете щелкнуть пустое пространство, но не макет. Попробуйте использовать wrap_content для android: layout_height для своего TextView. Установите также прослушиватель кликов для макета.

person Nikola Despotoski    schedule 20.07.2011
comment
Ширина TextView меньше, чем у его родителей, поэтому справа от Linearlayout должна оставаться интерактивная область. - person jul; 20.07.2011

Вы не используете свой собственный вид; вы используете стандартный LinearLayout. Ваш XML-тег должен быть:

<com.yourcode.ARView ...> ... </com.yourcode.ARView>
person cdhabecker    schedule 20.07.2011

Следует убедиться в том, что другое представление не находится поверх представления, которое вы пытаетесь щелкнуть. Это особенно часто встречается в FrameLayouts (где может быть покрыт ваш подчиненный LinearLayout) или с относительными макетами, которые вы, возможно, забыли обновить эту строку:

android:layout_below="@id/shouldBeTheIdOfTheViewCurrentlyBeingCovered"

чтобы представления не занимали одно и то же пространство.

person ColossalChris    schedule 25.09.2014

Если рассматриваемые представления TextViews, вам может потребоваться установить их как focusable="false", чтобы первый щелчок не использовался для фокусировки на текстовом представлении.

person CorayThan    schedule 26.01.2017

Проблема может быть в текстовом представлении, в макете которого есть android:layout_height="fill_parent". Если это не решит проблему, возможно, проблема в событии onClick (). Линейный макет может никогда не вызывать onClick (), поскольку это макет. Вместо этого попробуйте переопределить прослушиватель событий onTouch ().

person A. Abiri    schedule 20.07.2011

Добавьте следующие атрибуты в linearlayout. Любые события Click, не обрабатываемые дочерними представлениями, будут автоматически переданы LinearLayout.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    ...
    android:focusable="true"
    android:clickable="true">

<child/>
<child/>

</LinearLayout>
person Sanket Berde    schedule 06.07.2017

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

У меня есть класс, который расширяет LinearLayout с помощью TextView и ImageView. После расширения макета и получения представлений я назначил дочерним представлениям OnClickListener, при нажатии он выполняет onClickListner LineaLayout.

public class MyView extends LinearLayout {
private OnClickListener clickListener;
ImageView imageView;
TextView textView;

@Override
public void setOnClickListener(@Nullable OnClickListener l) {
    super.setOnClickListener(l);
    clickListener = l;
}

void afterViews() {
    imageView.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            clickListener.onClick(MyView.this);
            return false;
        }
    });
    textView.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            clickListener.onClick(MyView.this);
            return false;
        }
    });
}

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

person Gilles Braun    schedule 08.09.2017

Ни одно из вышеперечисленных решений не помогло мне. Затем я заметил, что LinkMovementMethod установлен на TextView внутри моего LinearLayout. Этот класс перехватывает события касания, события щелчка и свойства TextView, такие как кликабельность, фокусируемость и ..

person savepopulation    schedule 01.12.2017

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

View view = layoutInflater.inflate(R.layout.some_layout, someLinearLayout, false);
view.setClickable(false);

(Да, я пытался сделать some_layout не кликабельным в XML.)

person Roy Solberg    schedule 14.09.2018