Создание LinearLayout действует как кнопка

У меня есть LinearLayout, который я написал как кнопка, и содержит несколько элементов text/ImageView. Я хотел бы, чтобы весь LinearLayout действовал как кнопка, в частности, чтобы дать ей состояния, которые определены в a, поэтому при нажатии они имеют другой фон.

Есть ли лучший способ, чем сделать ImageButton размером всего макета и позиционирования абсолютно?

Ответ 1

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

android:clickable="true"

Или в коде с

yourLinearLayout.setClickable(true);

Ура!

Ответ 2

Если вы хотите добавить фоновое поведение по умолчанию для Android, чтобы сделать Layout действующим, как "clikable" View, установить на целевом Layout:

API 11+ (чистый Android):

android:background="?android:attr/selectableItemBackground"

API 7+ (Android + AppCompat Support Library):

android:background="?attr/selectableItemBackground"

Любой API:

android:background="@android:drawable/list_selector_background"

Ответы выше все еще верны, но не помогли мне просто добавить настроенное и выпущенное состояние пользовательского интерфейса по умолчанию (например, в ListView).

Ответ 3

Сначала вам нужно, чтобы селектор определял разные состояния. Например, в файле XML:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/button_pressed"
          android:state_pressed="true" />
    <item android:drawable="@drawable/button_focused"
          android:state_focused="true" />
    <item android:drawable="@drawable/button_normal" />
</selector>

Я не пробовал, но вы можете установить LinearLayout android: background для этого селектора и установить android: clickable to true, и он будет работать.

Если это не так, вы можете переключиться на использование RelativeLayout и сделать первый элемент кнопкой с этим селектором в качестве фона и fill_parent для его ширины и высоты макета. В этом случае просто используйте обычную кнопку и установите для Android селектор андроид: фон. Вам не нужно накладывать текст на кнопку.

Ответ 4

В приложении я работаю, мне нужно создать LinearLayout динамически. В этом случае команда

ll.setClickable(true);

не работает так, как предполагалось. Хотя я могу что-то пропустить, мне удалось использовать setOnTouchListener, чтобы получить тот же результат, и я отправлю код на тот случай, если у кого-то будут одинаковые потребности.

Следующий код создает LinearLayout с двумя текстовыми полями и круглыми углами, меняя цвет при нажатии.

Сначала создайте два xml файла в папке с возможностью копирования, один для обычного и один для нажатого состояния linearlayout.

Нормальное состояние xml (drawable/rounded_edges_normal.xml)

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="#FFFFFF" />
            <corners android:radius="7dp" />
            <padding android:left="5dip" android:top="5dip" android:right="5dip" android:bottom="5dip" />
        </shape>
    </item>
    <item android:bottom="3px">
        <shape android:shape="rectangle">
            <solid android:color="#F1F1F1" />
            <corners android:radius="7dp" />
        </shape>
    </item>
</layer-list>

Нажмите состояние xml (drawable/rounded_edges_pressed.xml). Единственное отличие в цвете...

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="#FFFFFF" />
            <corners android:radius="7dp" />
            <padding android:left="5dip" android:top="5dip" android:right="5dip" android:bottom="5dip" />
        </shape>
    </item>
    <item android:bottom="3px">
        <shape android:shape="rectangle">
            <solid android:color="#add8e6" />
            <corners android:radius="7dp" />
        </shape>
    </item>
</layer-list>

Затем следующий код выполняет задание

Глобальная переменная:

public int layoutpressed = -1;

В onCreate():

// Create some textviews to put into the linear layout...
TextView tv1 = new TextView(this);
TextView tv2 = new TextView(this);
tv1.setText("First Line");
tv2.setText("Second Line");

// LinearLayout definition and some layout properties...
final LinearLayout ll = new LinearLayout(context);
ll.setOrientation(LinearLayout.VERTICAL);

// it is supposed that the linear layout will be in a table.
// if this is not the case for you change next line appropriately...
ll.setLayoutParams(new TableRow.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));

ll.setBackgroundResource(R.drawable.rounded_edges_normal);
ll.addView(tv1);
ll.addView(tv2);
ll.setPadding(10, 10, 10, 10);
// Now define the three button cases
ll.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View arg0, MotionEvent arg1) {
                if (arg1.getAction()==MotionEvent.ACTION_DOWN){
                        ll.setBackgroundResource(R.drawable.rounded_edges_pressed);
                        ll.setPadding(10, 10, 10, 10);
                        layoutpressed = arg0.getId();
                }
                else if (arg1.getAction()== MotionEvent.ACTION_UP){
                        ll.setBackgroundResource(R.drawable.rounded_edges_normal);
                        ll.setPadding(10, 10, 10, 10);
                        if(layoutpressed == arg0.getId()){
                            //  ...........................................................................
                            // Code to execute when LinearLayout is pressed...
                            //  ........................................................................... 
                     }
          }
          else{
                ll.setBackgroundResource(R.drawable.rounded_edges_showtmimata);
                ll.setPadding(10, 10, 10, 10);
                layoutpressed = -1;
          }
          return true;
                }
  });           

Ответ 5

Просто установите эти атрибуты

<LinearLayout 
    ...
    android:background="@android:drawable/btn_default" 
    android:clickable="true"
    android:focusable="true"
    android:onClick="onClick"
    >
...
</LinearLayout>

Ответ 6

Я использовал первый и второй ответ. Но у моего linearlayout есть изображения и текст с цветом фона, поэтому мне пришлось изменить "фон" на "передний план"

LinearLayout

android:foreground="?android:attr/selectableItemBackground"
android:clickable="true"

Ответ 7

Предыдущие aswers были о том, как установить фон по умолчанию в XML файле. Вот то же самое в коде:

linearLayout1.setBackgroundResource(android.R.drawable.list_selector_background);