การสร้าง LinearLayout จะทำหน้าที่เหมือนปุ่ม


100

ฉันมีสิ่งLinearLayoutที่ฉันออกแบบให้ดูเหมือน a buttonและมีองค์ประกอบข้อความ / ImageView อยู่สองสามอย่าง ฉันต้องการทำให้การLinearLayoutกระทำทั้งหมดเหมือน a buttonโดยเฉพาะอย่างยิ่งเพื่อให้สถานะที่กำหนดไว้ดังนั้นจึงมีพื้นหลังที่แตกต่างกันเมื่อกด

มีวิธีที่ดีกว่าการสร้างImageButtonขนาดของ Layout ทั้งหมดและการวางตำแหน่งอย่างแน่นอนหรือไม่?


ในกรณีที่มีคนกำลังมองหาวิธีไฮไลต์ TableRow (ซึ่งสืบทอดมาจาก LinearLayout) บนการกด (เช่นปุ่ม) โปรดดูstackoverflow.com/a/8204768/427545
Lekensteyn

1
ถ้าใครต้องการที่จะได้รับการแก้ปัญหาเต็มตรวจสอบแหล่งเก็บข้อมูลนี้: github.com/shamanland/AndroidLayoutSelectorมีกำหนดเองสามารถคลิกได้ / ตรวจสอบได้LinearLayoutเช่นToggleButton
Oleksii เค

คำตอบ:


154

ฉันพบปัญหานี้ในตอนนี้ คุณจะต้องตั้งค่า LinearLayout ให้คลิกได้ คุณสามารถทำได้ใน XML ด้วย

android:clickable="true"

หรือในรหัสด้วย

yourLinearLayout.setClickable(true);

ไชโย!


2
คำตอบด้านล่างดีกว่าเยอะ!
Zach Sperske

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 แต่ต้องการจัดการตรรกะการคลิกด้วยตัวคุณเอง (และไม่ถูกบังคับให้ระบุเมธอด onClickX ซึ่งเป็นสิ่งที่ Android: ต้องการให้คลิกได้)
Rick Barkhouse

2
สิ่งนี้ใช้ได้กับระลอกการออกแบบวัสดุ คำตอบที่ดีที่สุด
Miro Markaravanes

3
ดี! เมื่อกดออกมาจะกลายเป็นสีส้ม / เหลืองเมื่อกด ฉันอยากจะเปลี่ยนสีเป็นสีเขียว ทำอย่างไร?
Han Whiteking

@HanWhiteking เจอมั้ย?
Jacob Sánchez

16

ฉันใช้คำตอบที่หนึ่งและสอง แต่ linearlayout ของฉันมีภาพและข้อความที่มีสีพื้นหลังฉันจึงต้องเปลี่ยน "พื้นหลัง" เป็น "พื้นหน้า"

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>

ฉันยังไม่ได้ลอง แต่คุณสามารถตั้งค่า android: background ของ LinearLayout เป็นตัวเลือกนี้ได้และตั้งค่า android: ที่คลิกได้เป็นจริงและมันจะใช้งานได้

หากไม่เป็นเช่นนั้นคุณสามารถเปลี่ยนไปใช้ RelativeLayout และทำให้องค์ประกอบแรกเป็นปุ่มที่มีตัวเลือกนี้เป็นพื้นหลังและ Fill_parent สำหรับความกว้างและความสูงของเค้าโครง ในกรณีนี้ให้ใช้ปุ่มปกติและตั้งค่า android: background เป็นตัวเลือกของคุณ คุณไม่จำเป็นต้องใส่ข้อความบนปุ่มของคุณ


Buttonใช่ฉันลงคะแนนเสียงสำหรับการใช้ที่เกิดขึ้นจริง คุณสามารถลบล้างonDraw(Canvas)เพื่อทำสิ่งพิเศษใด ๆ ที่คุณต้องการ (เช่นวาดภาพหรือข้อความภายในปุ่ม)
Dave

1
ขอบคุณ! การตั้งค่าพื้นหลังของ LinearLayout ใช้งานได้และตอบสนองต่อเหตุการณ์การสัมผัสเกือบ - ถ้าฉันกด LinearLayout โดยตรงสถานะของมันจะถูกอัปเดต ถ้าฉันกด TextView ข้างในเหตุการณ์การสัมผัสดูเหมือนจะไม่ขึ้นอยู่กับ LinearLayout มีความคิดอย่างไรในการสร้าง Layout hit-test?
Jason Prado

ลองใช้ android: clickable = "false" บน TextView ยังไม่ได้ลอง แต่ฉันไม่มีปัญหากับการคลิกผ่าน TextViews อาจเป็นเพราะ TextView ของคุณมีพื้นหลัง
Tenfour04

นี่เป็นเคล็ดลับแม้ว่าจะไม่ทำให้เสียงคลิกดังขึ้น มีวิธีที่จะทำให้ได้หรือไม่?
Steven

@ สตีเว่นเพิ่งเห็นความคิดเห็นเก่าของคุณขอโทษ ฉันคิดว่าเสียงคลิกเชื่อมโยงกับการกำหนด onClickListener ฉันมีบางอย่างกับ onTouchListener และมันจะไม่คลิกจนกว่าฉันจะเพิ่ม onClickListener ด้วย (ด้วยเมธอด onClick ที่ว่างเปล่า)
Tenfour04

7

ในแอปพลิเคชันฉันกำลังทำงานอยู่ฉันต้องสร้าง 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;
                }
  });           

6

เพียงตั้งค่าคุณลักษณะเหล่านี้

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

5

เพียงแค่เพิ่มพื้นหลัง attr / selectableItemBackground ในเลย์เอาต์เชิงเส้นและทำให้ linearlayout นั้นคลิกได้

ตัวอย่าง:

<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 ที่สามารถโฟกัสได้และจริงที่คลิกได้

โค้ดตัวอย่าง

   <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.