ListView और बटन के साथ Android लेआउट


101

ठीक है, यह विशिष्ट लेआउट मुझे परेशान कर रहा है। और नीचे की ओर बटन की एक पंक्ति के साथ एक सूची दृश्य के लिए एक रास्ता खोजने के लिए प्रतीत नहीं हो सकता है, ताकि सूची बटन के शीर्ष पर विस्तारित न हो, और इसलिए बटन हमेशा स्क्रीन के निचले भाग में तड़क रहे हैं। यहाँ मैं क्या चाहता हूँ:

मृत ImageShack लिंक को हटा दिया

ऐसा लगता है कि यह इतना आसान होना चाहिए, लेकिन मैंने जो भी कोशिश की है वह विफल रही है। कोई मदद?

यहाँ मेरा वर्तमान कोड है:

    RelativeLayout container = new RelativeLayout(this);
    container.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));

    //** Add LinearLayout with button(s)

    LinearLayout buttons = new LinearLayout(this);

    RelativeLayout.LayoutParams bottomNavParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    bottomNavParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
    bottomNavParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
    buttons.setLayoutParams(bottomNavParams);


    ImageButton newLayer = new ImageButton(this);
    newLayer.setImageResource(R.drawable.newlayer);
    newLayer.setLayoutParams(new LinearLayout.LayoutParams(45, LayoutParams.FILL_PARENT));
    buttons.addView(newLayer);

    container.addView(buttons);

    //** Add ListView

    layerview = new ListView(this);

    RelativeLayout.LayoutParams listParams = new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
    listParams.addRule(RelativeLayout.ABOVE, buttons.getId());

    layerview.setLayoutParams(listParams);

    container.addView(layerview);

अच्छा सवाल, बहुत सारे देव इस पर अटकने वाले हैं।
साइनकोडिंडी

शुक्र है, Android में डिजाइनर वास्तव में बहुत प्यारा है। इसलिए, लेआउट / UI बनाते समय, डिज़ाइनर / XML का उपयोग करने का प्रयास करें। विशेष रूप से इस परिदृश्य के लिए क्योंकि यह केवल बटनों का एक सेट और एक सूची दृश्य है।
Subby

जवाबों:


137

मुझे लगता है कि तुम इसे खोज रहे हो।

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:layout_height="fill_parent">

    <Button android:layout_width="fill_parent"
        android:layout_height="wrap_content" android:id="@+id/testbutton"
        android:text="@string/hello" android:layout_alignParentBottom="true" />

    <ListView android:layout_width="fill_parent"
        android:layout_height="fill_parent" android:id="@+id/list"
        android:layout_alignParentTop="true" android:layout_above="@id/testbutton" />

</RelativeLayout>

यही मैं मूल रूप से उपयोग कर रहा हूं, हालांकि मैं जावा में लेआउट लिख रहा हूं। सूची दृश्य अभी भी बटन पर फैली हुई है।
क्लेप्टिन

1
केवल एक चीज जो मैं बदल रहा हूं, वह यह है कि मैं ListView के आसपास एक रिश्तेदारलेयआउट जोड़ रहा हूं क्योंकि मैं एक सूची में AddRule (RelativeLayout.ABOVE) को कॉल नहीं कर सकता।
क्लेप्टिन

2
यह कोड ठीक काम करना चाहिए। ऊपर android:layout_above="@id/testbutton"रखना होगा । ListViewButton
कॉमंसवेयर

जब मैं इसका उपयोग करता हूं तो मुझे बटन के ऊपर रुकने के लिए सूची मिलती है और फिर आंतरिक रूप से स्क्रॉल करना शुरू करते हैं।
लार्स

7
आप कॉल नहीं करते addRule(RelativeLayout.ABOVE)एक पर RelativeLayout, या तो। आप इसे एक पर कॉल करें RelativeLayout.LayoutParams। फिर आप आपूर्ति जोड़ते हैं, ListViewजिससे आप RelativeLayoutआपूर्ति करते हैं RelativeLayout.LayoutParams। कृपया XML पर स्विच करने और इसे लंबे समय तक बनाए रखने के लिए फुलाए जाने पर विचार करें।
कॉमंसवेयर

57

मुझे उम्र के लिए वही समस्या थी।

ListView को बटनों के ऊपर रखने का समाधान, लेकिन सूची के लंबे होने पर उन्हें कवर करने से रोकना है, ListView पर Android: Layout_weight = "1.0" सेट करना है। बटन पर लेआउट_वेट को अनसेट करें ताकि वे अपने प्राकृतिक आकार में रहें, अन्यथा बटन स्केल हो जाएंगे। यह LinearLayout के साथ काम करता है।

Android ApiDemos में एक उदाहरण है: ApiDemos / res / लेआउट / linear_layout_9.xml


बस मुझे और दो घंटे बचाओ। समझ नहीं सका कि बटन कभी दिखाई क्यों नहीं दिए। :)
१४

मुझे पूरी तरह से समझ में नहीं आता कि यह क्यों काम करता है, लेकिन यह काम करता है :)
Bevor

20

मैं इस प्रश्न का उत्तर खोज रहा था और यह पहले परिणामों में से एक था। मुझे ऐसा लगता है जैसे सभी उत्तरों को, जिसमें वर्तमान में "सर्वश्रेष्ठ उत्तर" चुना गया है, के बारे में पूछे जाने वाले मुद्दे को संबोधित नहीं कर रहा है। जो समस्या बताई जा रही है, वह यह है कि दो घटकों का एक ओवरलैप है Buttonऔर ListViewइसमें लिस्ट व्यू पूरी स्क्रीन को उठा रहा है, और बटन नेत्रहीन ऊपर (सामने की ओर) लिस्ट व्यू (अंतिम दृश्य को देखने / एक्सेस करने से रोक रहा है) में आइटम ListView)

मैंने यहां और अन्य मंचों पर जो उत्तर देखे हैं, उनके आधार पर, मैं आखिरकार इस निष्कर्ष पर पहुंचा कि इसे कैसे हल किया जाए।

मूल रूप से, मेरे पास था:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:background="#FF394952">

  <ListView
    android:id="@+id/game_list"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    />

  <LinearLayout
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    style="@android:style/ButtonBar">

    <Button
      android:id="@+id/new_game"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:text="@string/new_game"
      android:textColor="#FFFFFFFF"
      android:background="@drawable/button_background" />
  </LinearLayout>

</RelativeLayout>

RelativeLayoutरूट नोड के रूप में उपयोग पर ध्यान दें ।

यह अंतिम, कार्यशील संस्करण है जिसमें बटन ओवरलैप नहीं होता है ListView:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:background="#FF394952">

  <ListView
    android:id="@+id/game_list"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_weight="1.0" />

  <LinearLayout
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    style="@android:style/ButtonBar">

    <Button
      android:id="@+id/new_game"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:text="@string/new_game"
      android:textColor="#FFFFFFFF"
      android:background="@drawable/button_background" />
  </LinearLayout>

</LinearLayout>

केवल दो अंतर हैं। सबसे पहले, मैं एक का उपयोग करने के लिए बंद कर दिया है LinearLayout। यह अगले बिट के साथ मदद करेगा, जो android:layout_weightमेरे लिए जोड़ रहा थाListView

आशा है कि ये आपकी मदद करेगा।


यह हल करती है, लेकिन कौन अनुमान लगाएगा !? जब आप android:layout_alignParentBottomएक LinearLayoutमाता-पिता के अंदर देते हैं , तो ADT कहता है "रेखीयलेयूट में अवैध लेआउट परम: लेआउट_लीनपैरेंटबॉटम"!
आश्विन कुमार

8

सबसे अच्छा तरीका एक रिश्तेदार लेआउट है जो सूची के नीचे बटन सेट करता है। इस उदाहरण में बटन एक रेखीय लेआउट में भी होते हैं क्योंकि उन्हें एक समान आकार में रखना आसान होता है।

<RelativeLayout android:id="@+id/RelativeLayout01" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent">

<ListView android:id="@+id/ListView01" 
android:layout_alignParentTop="true"
android:layout_width="fill_parent" 
android:layout_height="fill_parent">
</ListView>

<LinearLayout android:id="@+id/LinearLayout01" 
android:layout_below="@+id/ListView01" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:layout_alignParentBottom="true">
<Button android:id="@+id/ButtonJoin" 
android:text="Join"
android:layout_width="fill_parent" 
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_alignParentBottom="true">
</Button>
<Button android:id="@+id/ButtonJoin" 
android:layout_alignRight="@id/ButtonCancel" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Cancel"
android:layout_alignParentBottom="true">
</Button>
</LinearLayout>

</RelativeLayout>

समस्या यह है कि यह सूची में बहुत लंबा है, हालांकि सबसे नीचे बटन के ऊपर फैली हुई है, हालांकि। मैं यह पता नहीं लगा सकता कि इसे बटन के ऊपर कैसे रोकें।
क्लेप्टिन

2
यदि आप उपयोग कर रहे हैं (मुझे लगता है कि 1.5, शायद 1.6 भी है) तो आपके पास RelativeLayout नियमों का उपयोग करते समय ListView से पहले बटन होना चाहिए - अन्यथा, लेआउट को अभी तक बटनों के बारे में पता नहीं है क्योंकि यह उन्हें क्रम में पढ़ता है, यही कारण है कि आपका ListView विस्तारित होता है उनसे आगे निकला।
टिम एच।

यह मेरे लिए काम नहीं करता है। जैसे टिम एच कहते हैं, मेरे लिए मुझे लिनेरलॉयआउट के बाद लिस्ट व्यू को डालना होगा और फिर लिस्टव्यू लेआउट_एब को बनाना होगा, जैसे कि ऊपर दिए गए जवाब में।
नेमी

यह काम नहीं करेगा, बटन स्क्रीन पर नहीं होगा, और स्क्रॉल नहीं होगा
वैभव मिश्रा

1

मुझे पता है कि यह पोस्ट पुरानी है, लेकिन, मूल पोस्टर के प्रश्न का उत्तर देने के लिए, कोड के काम नहीं करने का कारण था बटन ।getId () रिटर्न -1। यदि आप ऐसा करने जा रहे हैं, तो आपको कॉल बटन की तरह कुछ करने की जरूरत है ।setId (10)। यदि आप ऐसा करते हैं, तो कोड ठीक काम करता है।


0

यह काम करना चाहिए। सूची के ऊपर बटन भी रखें, बटन को दूसरे रैखिक लेआउट के अंदर रखें।

<LinearLayout> main container // vertical

<LinearLayout> scrollview must be contained in a linear layout //vertical - height to fill parent

    <ScrollView> set the height of this to fill parent

        <ListView> will be contained in the scrollview
        </ListView>

    </ScrollView>

</LinearLayout>

<LinearLayout> //horizontal - height to wrap content

<Button>

</Button>

</LinearLayout>

</LinearLayout>

0

सबसे आसान समाधान दो रैखिक लेआउट बनाने के लिए होगा, एक बटन के साथ और दूसरा सूची दृश्य (बटन ऊंचाई पर लपेटें सामग्री और सूची लेआउट ऊंचाई पर माता-पिता से मेल खाने के लिए)। तब केवल सूची दृश्य के साथ लेआउट पर एक स्क्रॉल दृश्य बनाएं और बटन लेआउट को अनदेखा कर दिया जाएगा। उम्मीद है कि यह मदद करता है, माफ करना मुझे कोड लिखने की तरह महसूस नहीं हुआ।

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