Прослушиватель щелчков LinearLayout никогда не вызывается

#android #mobile #android-linearlayout #android-3.0-honeycomb

#Android #Мобильный #android-linearlayout #android-3.0-honeycomb

Вопрос:

Пытаюсь заставить прослушиватель onclick работать с linearlayout, но он никогда не вызывался : (. Я включил интерактивность и фокусировку (оба режима) и все еще не могу заставить прослушиватель щелчков отвечать. Сведения о платформе: Android 3.0.. Любая помощь?? Код ниже

            <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:id="@ id/menu_items_button"
                android:layout_width="0dip"
                android:layout_height="fill_parent"
                android:layout_weight="1"
                android:orientation="vertical"
                android:gravity="center_horizontal"
                android:paddingTop="@dimen/gen_margin_xsmall"
                android:paddingBottom="@dimen/gen_margin_xsmall"
                android:background="@drawable/rule_bg_menu_button"
                android:clickable="true"
              android:focusableInTouchMode="true"
            >
                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@drawable/menu_items"
                    android:tag="image"
                />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:tag="text"
                    android:text="@string/menu_items_icon_txt"
                    style="@style/textDisplay.mediumLarge"
                />

            </LinearLayout>
  

и в коде для добавления прослушивателя событий

 _itemsButton = (LinearLayout) menu.findViewById(R.id.menu_items_button);
final Intent itemsIntent = new Intent(this, ItemsActivity.class);
_itemsButton.setOnClickListener(
            new View.OnClickListener() {    
                @Override
                public void onClick(View v) {
                    startActivity(itemsIntent); //Never called!
                }
            }
        );
  

Причина, по которой я делаю это, а не использую вместо этого кнопку изображения, заключается в том, что фон «кнопки» зависит от состояния (изменения градиента), но также и от изображения, и для объединения двух при нажатии / фокусировке я использовал linearlayout, который сам по себе имеет ImageView.. есть предложения о том, почему ClickListener не работает в LinearLayout?

спасибо

Комментарии:

1. вы видите изменение состояния при нажатии на макет?

2. да, состояние действительно изменилось, изменился цвет фона, который определен в состоянии drawable

3. @pzulw понял правильно, просмотр изображения (внутри linearlayout) получает щелчок.. возможно, мне следует сделать его «не-кликабельным» или каким-то образом распространить щелчок на его родительский элемент..

4. это странно, ImageView по умолчанию не предполагается обрабатывать клики. Что, если вы нажмете на TextView ? По умолчанию щелчок должен проходить (только что попробовал с ImageView и здесь, API 8, это работает так) РЕДАКТИРОВАТЬ: может быть, установка statelistdrawable в качестве изображения делает его интерактивным? собираюсь попробовать

5. Проблема с этим подходом заключается в том, что если, например, у LinearLayout был фон, который менялся в зависимости от состояния нажатия и т.д., Эти эффекты будут потеряны. Иногда помогает заставить вложенные просмотры не реагировать на события щелчка, но не всегда (ImageView.setClickable(false) и т.д.).

Ответ №1:

Щелчок перешел в ImageView вместо LinearLayout? Попробуйте щелкнуть в области панели (если таковая имеется) или попробуйте поместить средство прослушивания щелчков в ImageView1.

Комментарии:

1. БОЛЕН!! u rock .. да, это произошло, как я могу перенести его сверху на его родительский элемент (linearlayout?)

2. Самый простой способ — установить один и тот же прослушиватель щелчков для просмотра изображения и текста. Вид. OnClickListener activityLauncher = новый просмотр. OnClickListener() {… } layout.setOnClickListener(activityLauncher); ImageView.setOnClickListener (activityLauncher); TextView.ImageView.setOnClickListener(activityLauncher);

3. Я знаю, что это поздно, но вы также можете установить ImageView как недоступный для просмотра в XML: android:clickable="false"

Ответ №2:

(добавляю свой ответ в качестве нового ответа, чтобы я мог использовать тег PRE.)

Самый простой способ — установить один и тот же прослушиватель щелчков для просмотра изображения и текста.

 View.OnClickListener activityLauncher = new View.OnClickListener() {... }
layout.setOnClickListener(activityLauncher);
imageView.setOnClickListener(activityLauncher);
textView.imageView.setOnClickListener(activityLauncher);
  

Ответ №3:

Ширина вашего экрана LinearLayout установлена на «0dip», вы ничего не должны видеть на экране.

Если изменить ширину на «FULL_PARENT», это сработает. Пожалуйста, еще раз внимательно проверьте свой код.

Комментарии:

1. Я вижу кнопку нормально. Ширина равна 0, потому что с ней связан вес, который обрабатывает ширину.

2. Затем попробуйте сделать так, чтобы LinearLayout заполнял весь экран, вы обнаружите, что макет действительно получает событие click. Я попробовал ваш код, он работает 🙂

3. Два примечания: 0dp (или 0dip) — это соответствующая layout_width при использовании с layout_weight . Во-вторых, это было бы «fill_parent», а не «full_parent», а в более новых версиях Android вы можете использовать «match_parent» вместо этого