LinearLayout을 버튼처럼 작동하게 만들기


100

나는. LinearLayout처럼 보이도록 스타일을 지정 button했으며 몇 가지 text / ImageView 요소가 포함되어 있습니다. 나는 전체를 만들고 싶다LinearLayout 행위를 button, 특히 눌렀을 때 다른 배경을 가지도록 정의 된 상태를 부여하기 위해.

ImageButton전체 레이아웃의 크기를 만들고 절대적으로 배치 하는 것보다 더 좋은 방법이 있습니까?


누군가가 누를 때 (LinearLayout에서 상속 된) TableRow (LinearLayout에서 상 속됨)를 강조 표시하는 방법을 찾고있는 경우 (예 : Button) stackoverflow.com/a/8204768/427545
Lekensteyn

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

필요하지 않은 경우, 클릭 리스너를 추가하는 것으로 충분했으며 클릭 리스너를 원하지 않는 경우 왜 무언가를 클릭 할 수 있기를 원하십니까?
hmac

158

Android 기본 백그라운드 비헤이비어를 추가하여 Layout"clikable"처럼 작동하도록 View하려면 타겟팅 된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에 필요한 onClickX 메소드를 지정하도록 강요하지 않음)
Rick Barkhouse

2
이는 머티리얼 디자인 잔물결에도 적용됩니다. 최고의 답변입니다.
Miro Markaravanes 2015

3
좋은! 눌렀을 때 눌린 효과로 주황색 / 노란색과 같은 색상으로 나타납니다. 색을 녹색으로 바꾸고 싶어요. 어떻게하나요?
Han Whiteking

@HanWhiteking 알아 냈어?
Jacob Sánchez

16

나는 첫 번째와 두 번째 대답을 사용했습니다. 하지만 내 선형 레이아웃에는 배경색이있는 이미지와 텍스트가 있으므로 "배경"을 "전경"으로 변경해야했습니다.

선형 레이아웃

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)당신이 필요로하는 어떤 특별한 일을하기 위해 재정의 할 수 있습니다 (즉, 버튼 안에 이미지 나 텍스트를 그립니다).
Dave

1
감사! LinearLayout의 배경 설정이 작동하고 터치 이벤트에 응답합니다. 거의 LinearLayout을 직접 누르면 상태가 업데이트됩니다. 내부에서 TextView를 누르면 터치 이벤트가 LinearLayout을 구성하지 않는 것 같습니다. 레이아웃 적중 테스트를 만드는 방법을 아십니까?
Jason Prado 2011

TextView에서 android : clickable = "false"를 사용해보세요. 이것을 시도하지 않았지만 TextViews를 클릭하는 데 문제가 없었습니다. 아마도 TextView에 배경이 있기 때문일 수 있습니다.
Tenfour04 2011

클릭 소리가 나지는 않지만 트릭을 수행했습니다. 그렇게 할 수있는 방법이 있습니까?
Steven

@Steven 방금 이전 댓글을 봤습니다. 죄송합니다. 클릭 소리가 onClickListener 할당과 관련이 있다고 생각합니다. onTouchListener에 무언가가 있었고 onClickListener (빈 onClick 메서드 포함)를 추가하기 전까지는 클릭하지 않았습니다.
Tenfour04 2014-06-24

7

작업중인 응용 프로그램에서 LinearLayout을 동적으로 만들어야합니다. 이 경우 명령

ll.setClickable(true);

예상대로 작동하지 않습니다. 내가 뭔가를 놓칠 수는 있지만 setOnTouchListener를 이용하여 동일한 결과를 얻었으며 누구나 동일한 요구 사항이있을 경우 코드를 제출합니다.

다음 코드는 두 개의 텍스트 뷰와 둥근 모서리가있는 LinearLayout을 만들고 누르면 색상이 변경됩니다.

먼저 드로어 블 폴더에 두 개의 xml 파일을 만듭니다. 하나는 일반용이고 다른 하나는 눌려진 선형 레이아웃 상태 용입니다.

일반 상태 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

배경 속성 / 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로 설정하고 포커스 가능을 true로 설정하고 클릭 가능을 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

이전 aswers는 xml 파일에서 기본 배경을 설정하는 방법에 관한 것이 었습니다. 여기 코드에서 똑같은 것 :

linearLayout1.setBackgroundResource(android.R.drawable.list_selector_background);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.