Ответ 1
для каждого дочернего
Android: duplicateParentState = "истина"
У меня есть пользовательский 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();
}
});
}
}
для каждого дочернего
Android: duplicateParentState = "истина"
android:duplicateParentState="true"
не помог мне.
Чтобы сделать ваш макет кликабельным с его дочерними элементами, вам нужно добавить этот параметр для каждого дочернего:
android:clickable="false"
Затем обработка щелчка будет вверх до родителя.
Это не ваше дело, но у меня была аналогичная проблема с clickable ViewGroup
. Через час поиска решения выяснилось, что я установил android:inputType
в TextView
внутри моего ViewGroup
, который блокировал onClick()
прослушиватель (не знаю почему)
Не используйте
android:inputType
с TextView
Высота TextView охватывает весь родительский объект (весь макет), поэтому вы можете щелкнуть по пустому пространству, но не на макете. Попробуйте использовать wrap_content для android: layout_height для вашего TextView. Настройте прослушиватель кликов и для макета.
Вы не используете свой собственный вид; вы используете стандартный LinearLayout. Ваш тег XML должен быть:
<com.yourcode.ARView ...> ... </com.yourcode.ARView>
android:duplicateParentState="true"
мой TextView выглядит как отключенный и не может получать событие click.
Все, что вам нужно, это установить TextView clickable="false"
. Таким образом, событие click будет отправляться в родительский макет, а TextView все еще может реагировать на событие касания (с эффектом пульсации).
Одна вещь, чтобы убедиться в том, что другое представление не находится над представлением, которое вы пытаетесь щелкнуть. Это особенно часто встречается в FrameLayouts (где может быть включен ваш дополнительный LinearLayout) или с относительными макетами, которые вы, возможно, забыли обновить эту строку:
android:layout_below="@id/shouldBeTheIdOfTheViewCurrentlyBeingCovered"
чтобы представления не заполняли одно и то же пространство.
Сделайте свой родитель LinearLayout android: clickable = "true"
Сделать все дочерние элементы андроид: clickable = "false"
В Linerryayout - удалить android: inputType = "" из TextView
Проблема может быть из текстового представления, имеющего android:layout_height="fill_parent"
в его макете. Если это не решит проблему, проблема может быть событием onClick(). Линейная компоновка на самом деле никогда не может вызвать onClick() с момента ее компоновки. Вместо этого попробуйте переопределить прослушиватель событий onTouch().
Если рассматриваемые представления TextView
s, вам может потребоваться установить их как focusable="false"
, чтобы первый клик не использовался, фокусируясь на текстовом представлении.
Добавьте следующие атрибуты в linearlayout Любые события Click, которые не обрабатываются дочерними представлениями, будут автоматически переданы LinearLayout.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
...
android:focusable="true"
android:clickable="true">
<child/>
<child/>
</LinearLayout>
У меня возникла та же проблема, и все атрибуты 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, но тогда у моих представлений у ребенка не было эффекта пульсации, который мне нужен.
Ни одно из вышеперечисленных решений не разветвлено для меня. Чем я заметил, что LinkMovementMethod
установлен на TextView
внутри моего LinearLayout
. Этот класс перехватывает события касания, выбирает события и свойства TextView
, такие как clickable, focusable vs..
Я столкнулся с той же проблемой, и все атрибуты XML не работали. Я думаю, что это происходит, потому что я программно раздуваю и добавляю взгляды. Для меня было исправлено - и это программно - сделать раздутым корневое представление не активным:
View view = layoutInflater.inflate(R.layout.some_layout, someLinearLayout, false);
view.setClickable(false);
(Да, я пытался some_layout
в XML.)
Создать переменную для LinearLayout
LinearLayout layout;
layout.setOnClicknersetOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
Toast t = Toast.makeText(context, "hey!", Toast.LENGTH_SHORT);
t.show();
}
});