LinearLayout एक बटन की तरह कार्य करना


100

मेरे पास एक LinearLayoutऐसा है जिसे मैंने एक स्टाइल की तरह देखा है button, और इसमें कुछ टेक्स्ट / ImageView तत्व हैं। मैं पूरे LinearLayoutअधिनियम को एक जैसा बनाना चाहता हूं button, विशेष रूप से यह बताता हूं कि इसे परिभाषित किया गया है ताकि इसे दबाए जाने पर इसकी एक अलग पृष्ठभूमि हो।

क्या ImageButtonपूरे लेआउट का आकार बनाने और पूरी तरह से स्थिति बनाने से बेहतर तरीका है ?


यदि कोई व्यक्ति प्रेस (एक बटन की तरह) पर TableRow (जो कि एक LinearLayout से विरासत में मिला है) को हाइलाइट करने के लिए रास्ता खोज रहा है, तो देखें stackoverflow.com/a/8204768/427545
Lekensteyn

1
यदि कोई पूर्ण समाधान प्राप्त करना चाहता है, तो इस भंडार की जाँच करें: github.com/shamanland/AndroidLayoutSelector कस्टम क्लिक करने योग्य / जाँच योग्य है LinearLayoutजैसेToggleButton
ओलेक्सी के।

जवाबों:


154

मैं अभी इस समस्या में भाग गया। आपको LinearLayout को क्लिक करने योग्य पर सेट करना होगा। आप या तो XML के साथ ऐसा कर सकते हैं

android:clickable="true"

या के साथ कोड में

yourLinearLayout.setClickable(true);

चीयर्स!


2
नीचे दिए गए जवाब बहुत बेहतर है!
Zach Sperske

2
इसके अलावा, यदि आपके पास इसके बच्चे के रूप में "क्लिक करने योग्य" तत्व है, तो android:clickable="false"इसे क्लिक घटनाओं को रोकने से रोकने के लिए जोड़ना न भूलें ।
TheKalpit

आवश्यक नहीं है, मेरे लिए एक क्लिक श्रोता जोड़ना पर्याप्त था और यदि आप एक क्लिक श्रोता नहीं चाहते हैं तो आप कुछ क्यों क्लिक करने योग्य होना चाहते हैं?
hmac

158

यदि आप लक्ष्य पर सेट, Layout" डिफ़ॉल्ट " की तरह कार्य करने के लिए Android डिफ़ॉल्ट पृष्ठभूमि व्यवहार जोड़ना चाहते हैं :ViewLayout

एपीआई 11+ (शुद्ध Android):

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

API 7+ (Android + AppCompat सपोर्ट लाइब्रेरी):

android:background="?attr/selectableItemBackground"

कोई भी एपीआई:

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

ऊपर दिए गए उत्तर अभी भी सही हैं, लेकिन मुझे डिफ़ॉल्ट दबाए गए और जारी किए गए UI स्थिति ( ListViewउदाहरण के लिए) को जोड़ने में मेरी मदद नहीं की ।


आपके लिए +1, यह बहुत अच्छा है यदि आप UI स्पर्श फ़ीडबैक चाहते हैं, लेकिन स्वयं क्लिक-लॉजिक को संभालना चाहते हैं (और onClickX पद्धति को निर्दिष्ट करने में मजबूर नहीं होना चाहिए, जो कि Android: क्लिक करने योग्य आवश्यक है)
रिक बर्कहाउस

2
यह भी सामग्री डिजाइन लहर के साथ काम करता है। सबसे बढ़िया उत्तर।
मिरो मार्कार्वेंस

3
अच्छा! जब इसे दबाया जाता है तो यह नारंगी / पीले रंग की तरह रंग बदल जाता है। मैं रंग को हरे रंग में बदलना चाहता हूं। यह कैसे करना है?
हान व्हाइटकिंग

@HanWhiteking क्या आपको पता चला?
जैकब

16

मैंने पहले और दूसरे उत्तर का उपयोग किया। लेकिन मेरे रेखांकन में पृष्ठभूमि रंग के साथ चित्र और पाठ हैं, इसलिए मुझे "पृष्ठभूमि" को "अग्रभूमि" में बदलना पड़ा।

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 के एंड्रॉइड: बैकग्राउंड को इस चयनकर्ता को सेट कर सकते हैं, और एंड्रॉइड को सेट कर सकते हैं: यह सच होने के लिए क्लिक करने योग्य है और यह काम करेगा।

यदि ऐसा नहीं होता है, तो आप एक RelativeLayout का उपयोग करने के लिए स्विच कर सकते हैं, और इस चयनकर्ता के साथ पृष्ठभूमि और चौड़ाई और ऊंचाई के लिए fill_parent के साथ पहला तत्व बना सकते हैं। इस मामले में, बस एक नियमित बटन का उपयोग करें और अपने चयनकर्ता को एंड्रॉइड: पृष्ठभूमि सेट करें। आपको अपने बटन पर टेक्स्ट नहीं लगाना है।


हाँ, मैं एक वास्तविक का उपयोग करने के लिए मतदान करता हूं Button। आपको onDraw(Canvas)जो भी विशेष चीजें चाहिए (यानी, चित्र या पाठ को बटन के भीतर खींचना) करने के लिए ओवरराइड कर सकते हैं ।
डेव

1
धन्यवाद! LinearLayout कार्यों की पृष्ठभूमि सेट करना और यह घटनाओं को छूने के लिए प्रतिक्रिया करता है, लगभग - अगर मैं सीधे LinearLayout दबाता हूं, तो इसकी स्थिति अपडेट की जाती है। यदि मैं इसके अंदर TextView दबाता हूं, तो टच इवेंट इसे LinearLayout तक नहीं बनाता है। किसी भी विचार कैसे लेआउट हिट-परीक्षण करने के लिए?
जेसन प्राडो

Android आज़माएं: TextView पर क्लिक करने योग्य = "झूठा"। यह कोशिश नहीं की है, लेकिन मुझे TextViews के माध्यम से क्लिक करने में कोई समस्या नहीं है। हो सकता है कि ऐसा इसलिए हो क्योंकि आपके टेक्स्ट व्यू में बैकग्राउंड हो।
तेनफौर ०४

यह चाल चली, हालांकि यह क्लिक ध्वनि नहीं करता है। क्या ऐसा करने का कोई तरीका है?
स्टीवन

@ सेंटेन ने आपकी पुरानी टिप्पणी को देखा, क्षमा करें। मुझे लगता है कि क्लिक ध्वनि एक onClickListener को सौंपा गया है। मेरे पास onTouchListener के साथ कुछ था और जब तक मैंने एक onClickListener (एक खाली onClick विधि के साथ) नहीं जोड़ा, तब तक यह क्लिक नहीं करेगा।
तेनफौर ०४

7

जिस एप्लिकेशन में मैं काम कर रहा हूं, मुझे गतिशील रूप से LinearLayout बनाने की आवश्यकता है। इस मामले में आदेश

ll.setClickable(true);

के रूप में काम करने वाला नहीं है। हालांकि मुझे कुछ याद आ सकता है, मैं एक ही परिणाम पाने के लिए setOnTouchListener का फायदा उठाने में कामयाब रहा और अगर किसी की भी ज़रूरतें हों, तो मैं कोड जमा करता हूं।

निम्न कोड दो पाठ और गोल कोनों के साथ एक रेखीयआउट बनाता है, जब दबाया जाता है तो रंग बदलता है।

सबसे पहले, ड्रा करने योग्य फ़ोल्डर में दो एक्सएमएल फाइलें बनाएं, एक सामान्य और एक दबाए गए लाइनरलेआउट राज्य के लिए।

सामान्य स्थिति 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">

जब इसे दबाया जाता है तो बटन की तरह लाइनरेक्टआउट कर सकते हैं। :)


1

यह मददगार था, लेकिन अगर आप बैकग्राउंड कलर लगाना चाहते हैं और लिस्ट के सामान की तरह लीनियर लेआउट को क्लिक करने योग्य बनाना चाहते हैं। अपने पसंदीदा रंग के साथ पृष्ठभूमि सेट करें और अग्रभूमि रंग सेट करें?

नमूना कोड

   <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);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.