LinearLayout बच्चों के बीच जगह कैसे बनाएं?


160

मैं प्रोग्राम को कस्टम रूप से एक ऊर्ध्वाधर रैखिकलेयूट में जोड़ रहा हूं, और मैं चाहूंगा कि विचारों के बीच कुछ स्थान हो। मैंने अपने CustomView कंस्ट्रक्टर को setPadding (0, 1, 0, 1) जोड़ने की कोशिश की है, लेकिन इसका कोई असर नहीं होता है। कोई सलाह?

* यह बताया गया कि मुझे मार्जिन का उपयोग करना चाहिए। चूंकि मैं गतिशील रूप से विचार जोड़ रहा हूं, मुझे कोड से मार्जिन निर्धारित करने की आवश्यकता है (एक्सएमएल में नहीं)। मेरा मानना ​​है कि ऐसा करने का तरीका नीचे है, लेकिन यह काम नहीं कर रहा है।

public class MyView extends View
{
    public MyView (Context context)
    {
        super(context);

        MarginLayoutParams params = new MarginLayoutParams(LayoutParams.WRAP_CONTENT,  LayoutParams.WRAP_CONTENT);
        params.setMargins(0, 10, 0, 10);
        setLayoutParams(params);

* संपादित करें। मैंने रैखिक लेआउट (नीचे के रूप में) के विचारों को जोड़ते हुए एक मार्जिन के रूप में MarginLayoutParams का उपयोग करने की कोशिश की। यह भी काम नहीं किया:

MarginLayoutParams params = new MarginLayoutParams(linearLayout.getLayoutParams());
linearLayout.setMargins(0, 10, 0, 10);
linearLayout.addView(view, params);

यदि आप XML फ़ाइल को जोड़ सकते हैं, जिसमें आप विचार जोड़ना चाहते हैं तो यह मदद कर सकता है।
डेनिस शीतकालीन

2
यहाँ इसके बारे में एक उत्कृष्ट ब्लॉग पोस्ट है: सिरिल मॉटियर द्वारा एंड्राइड पर ग्रिड स्पेसिंग
रिचर्ड ले

जवाबों:


131

आपको android:layout_margin<Side>बच्चों पर करना चाहिए । पैडिंग आंतरिक है।


आप एक्सएमएल में वांछित मार्जिन के साथ दृश्य को परिभाषित कर सकते हैं और पूर्वनिर्धारित दृश्यों को प्रक्रियात्मक रूप से जोड़ सकते हैं, साथ ही जावा कोड में सामग्री को लागू कर सकते हैं।
19

मैं वास्तव में इस बात से स्पष्ट नहीं हूं कि आपका इससे क्या मतलब है। मुझे xml में कस्टमव्यू को परिभाषित करना चाहिए? लेकिन मुझे गतिशील रूप से कस्टम दृश्य की एक मनमानी संख्या बनाने की आवश्यकता होगी, जिसे मैं फिर अपने रैखिकअरआउट में जोड़ूंगा।
एबी ११

2
केवल लेआउटपैराम्स का उपयोग करने का प्रयास करें मार्जिनलआउटआउट नहीं।
थॉमस

1
LinearLayout.LayoutParams में मैं क्या विशेषता सेट करूँगा? उस वर्ग को "मार्जिन" या "पैडिंग" या कुछ समान नहीं लगता है?
11

@ थोमस का मतलब क्या है "पैडिंग आंतरिक है"। क्या मुझे प्रत्येक घटक में मार्जिन लागू करना चाहिए, जिससे मैं बचने की कोशिश कर रहा हूं ताकि डुप्लिकेट कोड को कम से कम किया जा सके (जैसा कि मेरे बच्चे के घटकों के बीच उपयोग करने के लिए मेरे पास समान अंतर है)
ओमगनेश

188

एपीआई> = 11 समाधान:

आप पैडिंग को डिवाइडर में एकीकृत कर सकते हैं। यदि आप किसी का उपयोग नहीं कर रहे थे, तो बस एक लंबा खाली ड्रॉबल बनाएं और इसे LinearLayoutडिवाइडर के रूप में सेट करें :

    <LinearLayout
            android:showDividers="middle"
            android:divider="@drawable/empty_tall_divider"
...>...</LinearLayout>

empty_tall_divider.xml:

<?xml version="1.0" encoding="utf-8"?>

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <size
            android:height="40dp"
            android:width="0dp"/>
</shape>

आप इसका उपयोग API <11 पर कर सकते हैं, यदि आप LinearLayoutCompat: डेवलपर.
Android डेवलपर

5
यदि आप आकार को एक वर्ग की तरह बनाते हैं, तो आप इसे एक नया बनाने की आवश्यकता के बिना ऊर्ध्वाधर और क्षैतिज लिनियरलैटआउट में उपयोग कर सकते हैं जो कि चौड़ाई है।
वॉरेनफैथ

2
यहाँ इसके बारे में एक उत्कृष्ट ब्लॉग पोस्ट है: सिरिल मोटियर द्वारा एंड्राइड पर ग्रिड स्पेसिंग
रिचर्ड ले

1
यह बहुत बेहतर है यदि आपके पास विचारों का एक सेट है और उनमें से कुछ को चालू करें GONE। निर्दिष्ट करके android:showDividers="middle"आप केवल वही स्थान प्राप्त करेंगे जहाँ आपको वास्तव में इसकी आवश्यकता है।
डेरियसएल

@ DariusL मुझे d.android.com में इस शो डिवाइडर की विशेषता नहीं मिल रही है, क्या आप सुनिश्चित हैं कि हम इसका उपयोग कर सकते हैं?
हेनरी

35

एंड्रॉइड अब विचारों के बीच एक स्पेस व्यू को जोड़ने का समर्थन करता है । यह 4.0 आईसीएस के बाद से उपलब्ध है।


12
जाहिर तौर पर एंड्रॉइड-फेयरी ने आपकी बात सुनी और एपीआई 14 में एक "स्पेस" दृश्य बनाया :) ( डेवलपर.
android.com/reference/android/widget/Space.html

जबरदस्त हंसी! यह केवल समय की बात थी।
काम किया

8
लेकिन आपको प्रति दृश्य पर एक स्थान की आवश्यकता है, जो सभी विचारों के लिए एक अंतर घोषित करने के समान नहीं है।
लेटे

^ बहुत सही है। हालाँकि, यदि आप एक LinearLayout का उपयोग कर रहे हैं, तो आप एक विभाजक जोड़ सकते हैं जिसे प्रत्येक बच्चे के दृश्य पर लागू किया जाएगा। यहाँ देखें: developer.android.com/reference/android/widget/…
काम किया

1
यह कोई जवाब नहीं है।
चुपके रब्बी

24

नीचे दिए गए नमूने में वही होता है जो आपको प्रोग्रामेटिक रूप से चाहिए। मैंने (140,398) के निश्चित आकार का उपयोग किया है।

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(140, 398);
        layoutParams.setMargins(24, 0, 24, 0);
        layout.addView(button,layoutParams);

मैं एक और अतिरिक्त कदम के साथ कर रहा था जैसे कि LinearLayout.LayoutParams LayoutParams = new LinearLayout.LayoutParams (140, 398); लेआउटपार्म्स.सेटमार्गेन्स (24, 0, 24, 0); और फिर button1.setLayoutParams (LayoutParams); layout.addView (बटन, layoutParams); .. धन्यवाद देने के लिए धन्यवाद कि Addview 2 तर्क ले सकता है।
png

6

एपीआई स्तर 14 के बाद से आप सिर्फ एक (पारदर्शी) डिवाइडर को जोड़ सकते हैं:

android:divider="@drawable/divider"
android:showDividers="middle"

और यह आप के लिए बाकी संभाल लेंगे!


1
क्या आपको पहले एक विभक्त ड्रॉबल को निर्दिष्ट करने की आवश्यकता है या क्या आप इसे और कुछ नहीं के साथ उपयोग कर सकते हैं?
टिम किस्ट

8dpयह कहां से आया?
योषा अलाय्यूब

1
@ टिम्कट आप इसे और कुछ नहीं के साथ उपयोग कर सकते हैं, मुझे लगता है
तेहंसी

यह उत्तर गलत है क्योंकि एंड्रॉइड: डिवाइडरपैडिंग रैखिक लेआउट के बच्चों के बीच की दूरी को प्रभावित नहीं करता है। यह डिवाइडर के किनारों पर पैडिंग लगाता है जो बच्चों का सामना नहीं करता है (उदाहरण के लिए एक ऊर्ध्वाधर रेखीयआउट में डिवाइडर पर बाएं और दाएं पैडिंग)। Android प्रलेखन: developer.android.com/reference/android/widget/…
leorleor

2
@leorleor आप सही हैं। सबसे अच्छा तरीका संभवतः एक विभक्त ड्रॉबल का उपयोग करना है जो पारदर्शी है। मैंने उसी हिसाब से अपना जवाब अपडेट किया।
तेह.फोन्सी

4

के LinearLayout.LayoutParamsबजाय का उपयोग करें MarginLayoutParamsयहाँ प्रलेखन है।


LinearLayout.LayoutParams में मैं क्या विशेषता सेट करूँगा? उस वर्ग को "मार्जिन" या "पैडिंग" या कुछ समान नहीं लगता है?
ab11

LinearLayout.LayoutParamsफैली हुई है MarginLayoutParamsऔर इसे वही setMargins()विधि विरासत में मिली है जिसका आप ऊपर उपयोग कर रहे थे ...
क्रिस फी

ओह, धन्यवाद! मैं देख रहा था: android.view.ViewGroup.LayoutParams
ab11

3

यदि आप ActionBarSherlock का उपयोग करते हैं , तो आप com.actionbarsherlock.internal.widget.IcsLinearLout का उपयोग कर सकते हैं:

<com.actionbarsherlock.internal.widget.IcsLinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:divider="@drawable/list_view_divider"
        android:dividerPadding="2dp"
        android:showDividers="middle" >
...
</com.actionbarsherlock.internal.widget.IcsLinearLayout>

2

चाइल्ड व्यू के लेआउट में पैडिंग का उपयोग करना।

layout.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_margin="5dp"
          android:background="@drawable/backage_text"
          android:textColor="#999999"
           >

</TextView>

backage_text.xml

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

    <solid android:color="@color/white"/>
    <corners android:radius="2dp"/>
    <stroke
        android:width="1dp"
        android:color="#999999"/>
    <padding
        android:bottom="5dp"
        android:left="10dp"
        android:right="10dp"
        android:top="5dp" />
</shape>

0

आप LayoutParamsमाता LinearLayout- पिता से मिल सकते हैं और इस तरह से व्यक्तिगत विचारों पर लागू कर सकते हैं :

LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
lp.setMargins(8,8,8,8);
  • ध्यान रखें कि setMargins () int data type.So के रूप में पिक्सेल लेते हैं। मान जोड़ने से पहले dp में कनवर्ट करें
  • ऊपर कोड लपेटने के लिए ऊँचाई और चौड़ाई सेट करेगा। आप इसे अनुकूलित कर सकते हैं।

0

इस तरह दृश्य जोड़ने के बाद स्पेस विजेट जोड़ने की कोशिश करें:

layout.addView(view)
val space = Space(context)
space.minimumHeight = spaceInterval
layout.addView(space)

0

इसे गतिशील रूप से करने का एक आसान तरीका है बच्चों को पैडिंग जोड़ना । आप बस इसे जोड़ा जा सकता है। उपयोग की जाने वाली वस्तु पर .setPadding () का उपयोग कर। यह उदाहरण LinearLayout में ImageView जोड़ रहा है:

LinearLayout userFeedLinearLayout = (LinearLayout) findViewById(R.id.userFeedLinearLayout);
imageView.setImageBitmap(bitmap);
imageView.setPadding(0, 30, 0, 30);
userFeedLinearLayout.addView(imageView);

निम्न छवि दो ImageView दिखाती है कि गद्दी के साथ जोड़ा गया है:

बच्चों पर पैडिंग


-1

यदि आपके लेआउट में पाठ के लिए कुछ कंटेनर लेबल हैं। आप एक पंक्ति को विभाजित करने और तत्वों के बीच स्थान बनाने के लिए प्रत्येक पाठ "\ n" के अंत में जोड़ सकते हैं ।
उदाहरण:

video?.text="Video NR1: ${obj.Titulo} \n" 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.