Подтвердить что ты не робот

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();
            }
        });
    }
}
4b9b3361

Ответ 1

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

Android: duplicateParentState = "истина"

Ответ 2

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

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

 android:clickable="false"

Затем обработка щелчка будет вверх до родителя.

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

<com.yourcode.ARView ...> ... </com.yourcode.ARView>

Ответ 6

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

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

Ответ 7

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

android:layout_below="@id/shouldBeTheIdOfTheViewCurrentlyBeingCovered"

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

Ответ 8

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

Сделать все дочерние элементы андроид: clickable = "false"

В Linerryayout - удалить android: inputType = "" из TextView

Ответ 9

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

Ответ 10

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

Ответ 11

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

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

<child/>
<child/>

</LinearLayout>

Ответ 12

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

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

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, но тогда у моих представлений у ребенка не было эффекта пульсации, который мне нужен.

Ответ 13

Ни одно из вышеперечисленных решений не разветвлено для меня. Чем я заметил, что LinkMovementMethod установлен на TextView внутри моего LinearLayout. Этот класс перехватывает события касания, выбирает события и свойства TextView, такие как clickable, focusable vs..

Ответ 14

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

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

(Да, я пытался some_layout в XML.)

Ответ 15

Создать переменную для LinearLayout

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