#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» вместо этого