2011-03-23 22 views
73

मेरे लेआउट संरचना इसFrameLayout मार्जिन काम नहीं कर रहा

LinearLayout 
    FrameLayout 
     ImageView 
     ImageView 
    FrameLayout 
    TextView 
LinearLayout 

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

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

उत्तर

215

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

+19

में कोई वज़न नहीं है यह काम करता है, लेकिन यह मुझे गंदा महसूस करता है। मैंने सोचा कि मैं सीएसएस हैक्स के दिनों से बच गया था ... – erlando

+1

यह काम करता है, यह सोच रहा है कि यह एक बग है या नहीं? – Johnny

+1

FrameLayout.LayoutParams.gravity में 2.3 – JPM

0

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

+0

framelayout – njzk2

1

FrameLayout डॉक्स (link) से लिया

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

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

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

7

अपने xml इस विशेषता जोड़ सकते हैं और चलाने फिर

एंड्रॉयड: layout_gravity = "टॉप"

सब कुछ ठीक है!

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

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

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

+0

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

+0

यह एंड्रॉइड 10 पर margin_top के साथ मेरी समस्या का समाधान करता है। –

0

कोशिश setCropToPadding (सही) imageView करने के लिए, इस मदद की जानी चाहिए!

8

इसे और स्पष्ट करने के लिए क्यों।

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

तो अगर गुरुत्वाकर्षण -1 है, वहाँ कोई मार्जिन गणना हो जाएगा: FrameLayout.onLayout() कॉल यह (कम से कम एपीआई में v2.3.4) शामिल हैं। और बात यह है कि FrameLayout.LayoutParams में गंभीरता से परिभाषित किया गया है:

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

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

0

आपको अपने छवि दृश्य का लेआउट गुरुत्वाकर्षण शीर्ष i.e. एंड्रॉइड सेट करना होगा: XML संसाधन फ़ाइल में लेआउट_ग्रैविटी = "शीर्ष" या कोड से: FrameLayout.LayoutParams.gravity = गुरुत्वाकर्षण।शीर्ष

संबंधित मुद्दे