2012-10-18 13 views
9

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

शब्द का एक और तरीका यह है कि ए को हमेशा उपलब्ध ऊंचाई का कम से कम 50% प्राप्त करना चाहिए और बी को अधिकतम 50% प्राप्त करना चाहिए।

मुझे यह हासिल करने का एक आसान तरीका नहीं मिल रहा है। मैं दोनों लेआउट ऊंचाई को 0 पर सेट कर सकता हूं और उन्हें समान वजन देता हूं जो उन्हें 50% हमेशा बनाता है, लेकिन यदि बी 50% से छोटा है तो इसे केवल वही दिया जाना चाहिए जो इसे चाहिए।

एकमात्र तरीका मैं इसे करने के लिए देख सकता हूं ए या बी के लिए एक कस्टम क्लास का उपयोग करता है और माता-पिता के 50% तक ऊंचाई को बाधित करने के लिए माप पर ओवरराइड करता है, लेकिन ऐसा लगता है कि वहां एक आसान तरीका होना चाहिए।

+0

तो परिभाषित करने के लिए इनपुट क्या है कि बी को कितना बड़ा होना चाहिए? आप अपने कोड में एक गतिशील लेआउट बना सकते हैं ([एंड्रॉइड रेफरेंस लेआउट पैराम्स] (http://developer.android.com/reference/android/widget/LinearLayout.LayoutParams.html))। – MarchingHome

+0

बी बी की सामग्री कितनी बड़ी होनी चाहिए यह निर्धारित करने के लिए इनपुट एक लेआउट (वर्तमान में एक टुकड़ा) है जिसमें कुछ निश्चित आकार की सामग्री होती है लेकिन इसमें से अधिकांश टेक्स्टव्यू है जिसका सामग्री गतिशील है। पाठ की कुछ पंक्तियां या टेक्स्ट का एक लंबा पृष्ठ हो सकता है। यदि बी में टेक्स्ट लंबा है और बी 50% तक सीमित है तो पाठ स्क्रॉल करने योग्य होगा। –

+0

क्या आपने यह निर्धारित करने के लिए एक तरीका खोजा है कि बी में टेक्स्ट की कितनी पंक्तियां होंगी और इसके अनुसार बी की गतिशील गतिशील समायोजन की जाएगी? – MarchingHome

उत्तर

-1

दो आंतरिक फ्रेम के साथ एक रैखिक लेआउट बनाएं, प्रत्येक .5 वजन के साथ। उन फ्रेमों के अंदर, अपने विचार रखें, उन्हें wrap_content या match_parent पर उचित के रूप में सेट करें।

+0

लेकिन फिर ए की सामग्री 50% से अधिक नहीं हो सकती है या यह कर सकती है? – MarchingHome

+1

@ मार्चिंग आप सही हैं। यह 50% से अधिक नहीं हो सकता है। – Ahmad

+0

काफी नहीं मिलता है। एक छोटे बी को 50% तक विस्तारित करने की अनुमति देता है। –

3

ठीक है, मुझे अब मिल गया। , मैं यह सब onWindowFocusChanged में क्या करना है क्योंकि onCreate में अन्यथा दृश्य की ऊंचाई 0. वापसी होगी मैं बच्चे के लेआउट के रूप में 2 LinearLayouts साथ ऐसा किया था

if A > B -> do nothing 
if B > A & B > parent layout -> 50% to both of them 
if B > A & B < parent layout -> A = parent layout - B 

: अगर मैं सही ढंग से समझ तो आप इसे इस करना चाहते हैं लेकिन आप जो भी चाहें ले सकते हैं।

मेरे एक्सएमएल:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:id="@+id/parent_lay" 
    android:orientation="vertical" 
    android:layout_height="match_parent" > 

//Layout A: 
    <LinearLayout 
     android:id="@+id/lay_1" 
     android:layout_width="match_parent" 
     android:background="@android:color/background_dark" 
     android:layout_height="10dp" > 
    </LinearLayout> 
//Layout B: 
    <LinearLayout 
     android:id="@+id/lay_2" 
     android:layout_width="match_parent" 
     android:layout_height="40dp" 
     android:background="#123456" > 

    </LinearLayout> 

</LinearLayout> 

MainActivity:

public class MainActivity extends Activity { 
    LinearLayout parent_lay; 
    LinearLayout lay_1; 
    LinearLayout lay_2; 
    int parent_height; 
    int lay_1_height; 
    int lay_2_heigth; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 

    @Override 
    public void onWindowFocusChanged(boolean hasFocus) { 
     // TODO Auto-generated method stub 
     super.onWindowFocusChanged(hasFocus); 
     parent_lay = (LinearLayout) findViewById(R.id.parent_lay); 
     lay_1 = (LinearLayout) findViewById(R.id.lay_1); 
     lay_2 = (LinearLayout) findViewById(R.id.lay_2); 
     lay_1_height = lay_1.getHeight(); 
     lay_2_heigth = lay_2.getHeight(); 
     parent_height = parent_lay.getHeight(); 


     if (lay_2.getHeight() > lay_1.getHeight() 
       && lay_2.getHeight() > (parent_lay.getHeight()/2)) { 

      lay_1.setLayoutParams(new LinearLayout.LayoutParams(
        LayoutParams.MATCH_PARENT, 0, 1)); 

      lay_2.setLayoutParams(new LinearLayout.LayoutParams(
        LayoutParams.MATCH_PARENT, 0, 1)); 

     } else if (lay_2.getHeight() < (parent_lay.getHeight()/2)) { 
      lay_1.setLayoutParams(new LinearLayout.LayoutParams(
        LayoutParams.MATCH_PARENT, (parent_height - lay_2_heigth))); 

     } 

    } 

} 

उदाहरण: तो एक 60dp है और बी 40dp है:

enter image description here

,210

एक तो 60dp है और बी 400dp है:

enter image description here

+1

उस काम के लिए धन्यवाद, लेकिन आपको नियमों को सही नहीं मिला। बी हमेशा माता-पिता है - ए। यदि ए की मापी गई ऊंचाई आधे से कम माता-पिता के उपयोग से कम है, अन्यथा ए –

+0

@ डेलविंग के आकार के लिए माता-पिता का आधा उपयोग करें, तो आपने कहा था "बी को अधिकतम 50% मिलना चाहिए।" - तो 50% से अधिक नहीं, यह वही है जो मैंने किया था। मेरे उदाहरण बी * है * हमेशा (पैरेंट - ए) है, जब तक कि यह 50% अधिक न हो, तो सबसे अच्छा तरीका होगा यदि बी की मूल ऊंचाई अधिक हो तो 50% अधिकतर यह प्राप्त करने वाली सबसे अधिक जगह प्राप्त करेगी (50%) । – Ahmad

+0

मेरे जवाब में ओप्स मैंने ए और बी को उलट दिया। ए हमेशा माता-पिता होता है - बी। यदि बी की मापा ऊंचाई माता-पिता के आधे से कम है, अन्यथा बी के आकार के लिए माता-पिता का आधा उपयोग करें। फोकस परिवर्तन निश्चित रूप से स्थान नहीं है ऐसा करने के लिए, लेकिन लेआउट परिवर्तन श्रोताओं हैं। नीचे दिए गए मेरे समाधान के साथ प्रयास करेंगे और यदि यह काम नहीं करता है तो आपके समाधान पर फिर से विचार किया जाएगा। –

0

आप इस लक्ष्य को हासिल करने के लिए अपने स्वयं के घटक लिखना चाहिए।

उदाहरण के लिए, यदि आप यहां लाइनरलाइट का उपयोग करते हैं, तो आप ओवरराइड ऑन मेजर विधि के साथ एक लीनियरलाउट बढ़ा सकते हैं। आप इस तरह मेजर को कार्यान्वित कर सकते हैं:

@Override 
protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) { 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 

    final int width = getMeasuredWidth(); 
    final int height = getMeasuredHeight(); 
    setMeasuredDimension(width, height/2); 
} 

यह कोड पर्याप्त सुरुचिपूर्ण नहीं है। यदि आप वास्तव में इसे अच्छी तरह से करना चाहते हैं, तो एंड्रॉइड स्रोत कोड से मूल पर मेजर विधि की प्रतिलिपि बनाएँ (http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/ एंड्रॉइड/विजेट/LinearLayout.java # LinearLayout.on माप% 28int% 2Cint% 29), और measureVertical(int widthMeasureSpec, int heightMeasureSpec) में, mTotalLength = mTotalLength/2 सेट करें।

ऑन मेजर की विस्तृत जानकारी के लिए, http://developer.android.com/guide/topics/ui/custom-components.html और http://developer.android.com/reference/android/view/View.html#onMeasure(int, int पर जाएं)।

+0

आपके पास जो कुछ है, वह एक वस्तु को आधे स्थान ले लेगा जो सामान्य रूप से लेता है, जो मैं नहीं चाहता था। मैं चाहता हूं कि यह अपने माता-पिता की आधा जगह ले ले, लेकिन केवल तभी जब यह अपने मूल स्थान के आधे से बड़ा हो। यदि यह छोटा है तो इसे केवल उस कमरे में ले जाना चाहिए जिसकी आवश्यकता है। –

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