2013-08-06 5 views
7

में fill_parent होने के लिए लेआउट की चौड़ाई प्राप्त करें मेरे पास LinearLayout है जो xml में fill_parent के रूप में चौड़ाई सेट के साथ है, अब मुझे प्रोग्रामटाइम पर रनटाइम पर इसकी चौड़ाई चाहिए। तो मैं इस किया था:एंड्रॉइड: अपने xml

LinearLayout layoutGet=(LinearLayout) findViewById(R.id.GameField1); 
    LayoutParams layParamsGet= layoutGet.getLayoutParams(); 
    int width=layParamsGet.width; 

लेकिन डिबगिंग के बारे में width मूल्य क्यों नहीं मैं सही चौड़ाई रनटाइम पर LinearLayout के लिए fill_parent लेआउट एक्सएमएल में सेट के साथ प्राप्त कर सकते हैं विचार के साथ -1, किसी को भी हो पाया था।

उत्तर

27

जेन्स Vossnack का दृष्टिकोण ठीक काम करता है की जरूरत है। हालांकि, मैंने पाया कि GlobalLayoutListener की onGlobalLayout() विधि को बार-बार कहा जाता है, जो कुछ मामलों में उचित नहीं हो सकता है।

मुझे एक आसान तरीका काम करना पड़ा।

myLayout = (RelativeLayout) findViewById(R.id.my_layout); 
myLayout.post(new Runnable() 
    { 

     @Override 
     public void run() 
     { 
      Log.i("TEST", "Layout width : "+ myLayout.getWidth()); 

     } 
    }); 
+1

अच्छा जवाब –

+0

इस उत्तर मैं खोज रहा था था के लिए +1, मैं दृश्य को मापने और जब तक मैं अपने जवाब मिल गया है, जबकि दृश्य अभी तक नहीं है रखी बाहर का उपयोग करें, यह हमेशा 0 लौटे करने की जरूरत है, धन्यवाद –

+2

यह धागे के भीतर अच्छी तरह से क्यों काम करता है लेकिन रिटर्न 0 के बाहर? –

4

आप globalLayout घटना को सुनने के लिए कोशिश कर सकते हैं काम करते हैं, और वहाँ में चौड़ाई मिलना चाहिए। आपको शायद -1 मिल जाएगा क्योंकि आप विचारों को बिछाने से पहले चौड़ाई पाने की कोशिश कर रहे हैं।

vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
     //Do it here 
     LinearLayout layoutGet=(LinearLayout) findViewById(R.id.GameField1); 
     LayoutParams layParamsGet= layoutGet.getLayoutParams(); 
     int width=layParamsGet.width; 
     removeOnGlobalLayoutListener(layoutGet, this); // Assuming layoutGet is the View which you got the ViewTreeObserver from 
    } 
}); 

@SuppressLint("NewApi") 
public static void removeOnGlobalLayoutListener(View v, ViewTreeObserver.OnGlobalLayoutListener listener){ 
    if (Build.VERSION.SDK_INT < 16) v.getViewTreeObserver().removeGlobalOnLayoutListener(listener); 
    else v.getViewTreeObserver().removeOnGlobalLayoutListener(listener); 
} 

आप FILL_PARENT के लिए मूल्य को देखें, तो

1

(आप का उपयोग करना चाहिए MATCH_PARENTFILL_PARENT के बाद से अब हटा दिया गया है) आप के लिए मूल्य देखेंगे (VTO दृश्य आपको की चौड़ाई प्राप्त करना चाहते है) यह -1 है। LayoutParams आपके विचार को देखने के लिए केवल विशेषताएं हैं। एक बार दृश्य फुलाया जाता है और पैराम निर्दिष्ट करने के तरीके को देखता है, तो दृश्य वापस नहीं जाता है और दृश्यों के वास्तविक मूल्य (चौड़ाई/ऊंचाई/आदि) को प्रतिबिंबित करने के लिए उन पैराम को बदलता है।

यदि आप अपने दृश्य की वास्तविक चौड़ाई प्राप्त करना चाहते हैं तो लेआउट को फुलाए जाने और प्रदर्शित होने के बाद आपको अपने दृश्य पर getWidth() पर कॉल करना होगा। getWidth() कॉल करने से पहले अपने लेआउट में सभी की 0.

LinearLayout layoutGet=(LinearLayout) findViewById(R.id.GameField1); 
int width = layoutGet.getWidth(); 
0

सबसे पहले परिणाम होगा प्रदर्शित किया गया है, तो आप fill_parent के बजाय match_parent का उपयोग करना चाहिए (बहिष्कृत)।

जब आप int width=layParamsGet.width; करते हैं, तो आप सही परिणाम लेते हैं जो -1fill_parent पर संबंधित है। आप वास्तविक चौड़ाई प्राप्त करने के लिए wan't, तुम्हारे onMesure() कॉल प्रतीक्षा करें और का उपयोग

LinearLayout layoutGet=(LinearLayout) findViewById(R.id.GameField1); 
int width = layoutGet. getMeasuredHeight(); 
संबंधित मुद्दे