फ्रेमलैट मार्जिन काम नहीं कर रहा है


79

मेरी लेआउट संरचना इस तरह है

LinearLayout
    FrameLayout
       ImageView
       ImageView
    FrameLayout
    TextView
LinearLayout

मैंने दो ImageView के लिए मार्जिन सेट किया है जो फ्रेमलेयआउट के अंदर हैं। लेकिन फ़्रेमलैट मार्जिन को खारिज कर दिया गया है और यह हमेशा छवि को ऊपरी बाएं कोने में सेट करता है। अगर मैं फ्रेमलेयआउट से लिनियरलैट में बदलता हूं तो मार्जिन का काम ठीक से होता है। इसे कैसे संभालना है?

<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/inner1"
    >
        <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
        >

            <ImageView
             android:layout_width="24px" 
             android:layout_height="24px" 
             android:id="@+id/favicon"
             android:layout_marginLeft="50px"
             android:layout_marginTop="50px"
             android:layout_marginBottom="40px"
             android:layout_marginRight="70px"      

            />      
            <ImageView
             android:layout_width="52px" 
             android:layout_height="52px" 
             android:id="@+id/applefavicon" 
             android:layout_marginLeft="100px"
             android:layout_marginTop="100px"
             android:layout_marginBottom="100px"
             android:layout_marginRight="100px"              
            />

        </FrameLayout>  
            <TextView
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content" 
            android:id="@+id/title"                 
            android:layout_marginLeft="10px"        
            android:layout_marginTop="20px"
            android:textColor="#FFFFFF"  
            android:textSize = "15px"
            android:singleLine = "true"
            />

    </LinearLayout>

जवाबों:


221

मेरे पास भी यही मुद्दा था और मैंने देखा कि layout_मार्जिन सेट करना तब तक काम नहीं करता है जब तक कि आप अपने ImageView के लेआउट को गुरुत्वाकर्षण android:layout_gravity="top"या XML संसाधन फ़ाइल में या कोड से सेट न करें FrameLayout.LayoutParams.gravity = Gravity.TOP;:।


21
यह काम करता है, लेकिन यह मुझे गंदा लगता है। मुझे लगा कि मैं CSS हैक के दिनों में बच गया ...
erlando

1
FrameLayout.LayoutParams.gravity में 2.3 का गुरुत्वाकर्षण विकल्प नहीं है
JPM

2
यह 4.1 (शायद पहले) पर तय किया गया लगता है। हालांकि यह जानने के लिए उपयोगी है
pablisco

एक मुद्दा मैं पुराने जलाने आग पर चल रहा था तय की। धन्यवाद!
DallinDyer

12
इसे और अधिक स्पष्ट करने के लिए क्यों। FrameLayout.onLayout () कॉल में यह (api v2.3.4 कम से कम) शामिल है: // for each child: final LayoutParams lp = (LayoutParams) child.getLayoutParams(); final int gravity = lp.gravity; if (gravity != -1) { // handle all margin related stuff इसलिए यदि गुरुत्वाकर्षण -1 है, तो कोई मार्जिन गणना नहीं होगी। FrameLayout.LayoutParams में गुरुत्वाकर्षण द्वारा परिभाषित किया गया है: gravity = a.getInt(com.android.internal.R.styleable.FrameLayout_Layout_layout_gravity, -1); इसलिए यदि गुरुत्वाकर्षण सेट नहीं है, तो कोई मार्जिन गणना नहीं होगी।
मिकेलो जैकब

8

इसे और अधिक स्पष्ट करने के लिए क्यों। FrameLayout.onLayout () कॉल में यह शामिल है (एपीआई v2.3.4 में कम से कम):

    // for each child
    final LayoutParams lp = (LayoutParams) child.getLayoutParams();
    final int gravity = lp.gravity;
    if (gravity != -1) {
        // handle all margin related stuff

इसलिए यदि गुरुत्वाकर्षण -1 है, तो कोई मार्जिन गणना नहीं होगी। और बात यह है कि, FrameLayout.LayoutParams में गुरुत्वाकर्षण द्वारा परिभाषित किया गया है:

    gravity = a.getInt(com.android.internal.R.styleable.FrameLayout_Layout_layout_gravity, -1);

इसलिए यदि गुरुत्वाकर्षण सेट नहीं है, तो कोई मार्जिन गणना नहीं होगी।


7

अपने xml इस विशेषता को जोड़ें और पुनः चलाएं

एंड्रॉइड: लेआउट_ग्रेविटी = "टॉप"

सब कुछ ठीक है!

और आप इस तरह नए लेआउट params सेट नहीं है;

FrameLayout.LayoutParams llp = new FrameLayout.LayoutParams(WallpapersActivity.ScreenWidth/2, layH);

इस तरह का उपयोग करें:

FrameLayout.LayoutParams llp = (LayoutParams) myFrameLay.getLayoutParams();
llp.height = 100;
llp.width = 100;
myFrameLay.setLayoutParams(llp);

1
इसलिए यदि आपके पास लेआउटपैराम नहीं है, तो यह दूसरी विधि के साथ क्रैश हो जाएगा।
लीनो पेलेटियर

आप इसे == अशक्त नियंत्रण के साथ देख सकते हैं।
सावास अदार

यह एंड्रॉइड 10. पर मार्जिन_टॉप के साथ मेरी समस्या को हल करता है
पेड्रो पाउलो एमोरिम

1

फ़्रेमलेआउट डॉक्स ( लिंक ) से लिया गया

फ़्रेम लेआउट का आकार उसके सबसे बड़े बच्चे (प्लस पैडिंग) के आकार का है, दृश्यमान है या नहीं (यदि फ्रेमलैटआउट के माता-पिता परमिट हैं)।

यह इस तथ्य का वर्णन करने के लिए लगता है कि यह मार्जिन को अलग कर देगा। उल्लिखित बोल्डर की तरह, आप पैडिंग पर स्विच करने का प्रयास कर सकते हैं क्योंकि इसका उपयोग एक समान प्रभाव पैदा करने के लिए किया जा सकता है अगर ठीक से किया जाए।

जिज्ञासा से बाहर, आपने उल्लेख किया कि LinearLayoutकंटेनर का उपयोग करते समय यह ठीक काम करता है , क्यों फ्रेमलेयूट का विकल्प?


0

क्या आपने Android की कोशिश की: लेआउट_ग्रेविटी? Android का उपयोग करने का प्रयास करें: Android के बजाय ImageViews में आपको पेडिंग करें: layout_margin। AFAIK मार्जिन फ्रेम लेआउट पर ठीक से काम नहीं करता है। मुझे एक बार उस उद्देश्य के लिए कस्टम लेआउट भी लिखना पड़ा। BTW, आप कैसे ImageViews आवंटित करना चाहते हैं?


एक तामचीनी में कोई वजन नहीं है
njzk2


0

आपको XML Image फाइल में अपना ImageView का लेआउट गुरुत्व शीर्ष यानी android: layout_gravity = "top" सेट करना होगा, या कोड से: FrameLayout.LayoutParams.gravity = Gravity.TOP

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