LinearLayoutをボタンのように動作させる


100

私はのLinearLayoutように見えるようにスタイルを設定したものがbuttonあり、それにはいくつかのtext / ImageView要素が含まれています。私は全体をのようにLinearLayout動作させたい、button特にa で定義された状態を与えて、押されたときに異なる背景を持つようにしたいと思います。

ImageButtonレイアウト全体のサイズを作成して絶対に配置するよりも良い方法はありますか?


(LinearLayoutから継承された)TableRowを(ボタンのように)押すと強調表示する方法を誰かが探している場合は、stackoverflow.com
a / 8204768/427545

1
誰かが完全なソリューションを取得したい場合は、このリポジトリを確認してください:github.com/shamanland/AndroidLayoutSelector次のLinearLayoutようなカスタムのクリック可能/チェック可能ToggleButton
Oleksii K.

回答:


154

ちょうど今この問題に遭遇しました。LinearLayoutをクリック可能に設定する必要があります。あなたはどちらかでXMLでこれを行うことができます

android:clickable="true"

またはコードで

yourLinearLayout.setClickable(true);

乾杯!


2
以下の答えははるかに優れています!
Zach Sperske、2015

2
また、「クリック可能な」要素を子として持っている場合は、android:clickable="false"クリックイベントをブロックしないように必ず追加してください。
TheKalpit 2017年

必要ではありません。クリックリスナーを追加するだけで十分です。クリックリスナーが必要ない場合は、クリック可能なものにしたいのはなぜですか。
hmac

158

Androidのデフォルトのバックグラウンドビヘイビアーを追加してLayout、「clikable」のような動作をさせる場合Viewは、targetedに設定しますLayout

API 11+(Pure Android):

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

API 7+(Android + AppCompatサポートライブラリ):

android:background="?attr/selectableItemBackground"

任意のAPI:

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

上記の答えはまだ当てはまりますが、デフォルトの押されて解放されたUI状態を追加するだけでは役に立ちませんでした(ListViewたとえば)。


+1:UIタッチフィードバックが必要で、クリックロジックを自分で処理したい場合(そして、android:
clickable

2
これは、マテリアルデザインのリップルでも機能します。ベストアンサー。
Miro Markaravanes、2015

3
良い!押すとオレンジ/黄色のような色になり、押した効果になります。緑色にしたい。どうやってするの?
Han Whiteking 2017年

@HanWhiteking見つけた?
ジェイコブ・サンチェス

16

最初と2番目の答えを使用しました。しかし、私のlinearlayoutには背景色の画像とテキストがあるため、「背景」を「前景」に変更する必要がありました

線形レイアウト

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

9

最初に、さまざまな状態を定義するセレクターが必要になります。たとえば、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をtrueに設定すれば動作する可能性があります。

そうでない場合は、RelativeLayoutを使用するように切り替え、最初の要素をこのセレクターを背景とし、レイアウトの幅と高さをfill_parentとしてボタンにすることができます。この場合、通常のボタンを使用して、android:backgroundをセレクターに設定します。ボタンにテキストを配置する必要はありません。


ええ、私は実際の使用に投票しButtonます。オーバーライドonDraw(Canvas)して、必要な特別なことをすべて実行できます(つまり、ボタン内に画像やテキストを描画します)。
デイブ、

1
ありがとう!LinearLayoutの背景の設定は機能し、タッチイベントに応答します。ほぼ– LinearLayoutを直接押すと、その状態が更新されます。その中のTextViewを押しても、タッチイベントがLinearLayoutを構成していないようです。レイアウトヒットテストを作成する方法はありますか?
Jason Prado

TextViewでandroid:clickable = "false"を試してください。これを試したことはありませんが、TextViewsをクリックすることに問題はありませんでした。多分それはあなたのTextViewに背景があるからです。
Tenfour04

これでうまくいきましたが、クリック音は鳴りません。それを行う方法はありますか?
Steven

@Steven申し訳ありませんが、古いコメントを見ました。クリック音はonClickListenerが割り当てられていることに関係していると思います。私はonTouchListenerを使用して何かを持っていて、onClickListener(空のonClickメソッドを使用)も追加するまでクリックしませんでした。
Tenfour04 2014年

7

私が作業しているアプリケーションでは、LinearLayoutを動的に作成する必要があります。この場合、コマンド

ll.setClickable(true);

想定どおりに動作していません。見落としがあるかもしれませんが、setOnTouchListenerを利用して同じ結果を取得し、同じニーズがある場合に備えてコードを送信しました。

次のコードは、2つのテキストビューと丸い角を持つLinearLayoutを作成し、押すと色が変わります。

最初に、2つのxmlファイルを描画可能なフォルダーに作成します。1つは通常用で、もう1つは押された線形レイアウト状態用です。

通常の状態の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;
                }
  });           

6

これらの属性を設定するだけです

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

5

背景attr / selectableItemBackgroundを線形レイアウトに追加し、その線形レイアウトをクリック可能にするだけです

例:

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/linear1"
android:background="?android:attr/selectableItemBackground"
android:clickable="true"
android:focusable="true">

それはそれが押されたときにlinearlayoutがボタンのように機能することです。:)


1

これは役に立ちましたが、背景色を配置して、リストアイテムのように直線レイアウトをクリック可能にしたい場合。好みの色で背景を設定し、前景色を?android:attr / selectableItemBackgroundに設定し、focusableをtrue、clickableをtrueに設定します

サンプルコード

   <LinearLayout

        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="10dp"
        android:background="#FF0"
        android:orientation="horizontal"
        android:paddingBottom="10dp"
         android:paddingTop="10dp"
        android:onClick="onClickMethod"
        android:clickable="true"
        android:focusable="true"
        android:foreground="?android:attr/selectableItemBackground"
        />

0

以前の回答者は、xmlファイルでデフォルトの背景を設定する方法についてでした。コードで同じこと:

linearLayout1.setBackgroundResource(android.R.drawable.list_selector_background);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.