2010-03-18 17 views
10

मैं लाइनरलेआउट में गतिशील रूप से दृश्य जोड़ने की कोशिश कर रहा हूं। मैं getChildCount() के माध्यम से देखता हूं कि विचार लेआउट में जोड़े गए हैं, लेकिन लेआउट पर अमान्य() को कॉल करने से मुझे बच्चे दिखाई नहीं देते हैं।एक दृश्य जोड़ने के बाद एक रैखिक स्तर को रीफ्रेश करना

क्या मुझे कुछ याद आ रही है?

+1

हमें कुछ कोड दिखाएं, क्योंकि आप इसे गलत कर सकते हैं। – Pentium10

+0

मैं बस एक दृश्य बनाता हूं, इसे लाइनरलेआउट में जोड़ता हूं और अमान्य() कॉल करता हूं। – lbedogni

उत्तर

19

चीजें आप अपने कोड में जाँच कर सकते हैं के एक जोड़े:

  • View कि जोड़ा जा रहा है पर, जाँच लें कि आप एक उपयुक्त ViewGroup.LayoutParameter के साथ अपने setLayoutParameter विधि कॉल।
  • जब आप नया View एस जोड़ते हैं, तो सुनिश्चित करें कि आप इसे यूआई थ्रेड पर कर रहे हैं। ऐसा करने के लिए, आप पैरेंट View की post विधि का उपयोग कर सकते हैं।

यह आत्म निहित जब यह शुरू होता है उदाहरण के थोड़ी देर बाद एक TextView जोड़ता है:

import java.util.Timer; 
import java.util.TimerTask; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.ViewGroup; 
import android.widget.LinearLayout; 
import android.widget.TextView; 

public class ProgrammticView extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     final LinearLayout layout = new LinearLayout(this); 
     layout.setLayoutParams(new ViewGroup.LayoutParams(
       ViewGroup.LayoutParams.FILL_PARENT, 
       ViewGroup.LayoutParams.FILL_PARENT)); 

     setContentView(layout); 

     // This is just going to programatically add a view after a short delay. 
     Timer timing = new Timer(); 
     timing.schedule(new TimerTask() { 

      @Override 
      public void run() { 
       final TextView child = new TextView(ProgrammticView.this); 
       child.setText("Hello World!"); 
       child.setLayoutParams(new ViewGroup.LayoutParams(
         ViewGroup.LayoutParams.FILL_PARENT, 
         ViewGroup.LayoutParams.WRAP_CONTENT)); 

       // When adding another view, make sure you do it on the UI 
       // thread. 
       layout.post(new Runnable() { 

        public void run() { 
         layout.addView(child); 
        } 
       }); 
      } 
     }, 5000); 
    } 
} 
+0

मैं हैंडलर के अंदर नए आकार बना देता हूं। अजीब तथ्य यह है कि पहला आकार लाइनरलेआउट पर खींचा जाता है, लेकिन अगले वाले नहीं। – lbedogni

+0

जांचें कि आपने एंड्रॉइड जोड़ा है: अभिविन्यास = "लंबवत" LinearLayout – karabara

2

मैं एक ही समस्या थी और पाया है कि मेरी ओवरराइड onMeasure() विधि अमान्य के बाद आमंत्रित नहीं किया गया। तो मैंने LinearLayout में अपना स्वयं का सबराउटिन बनाया और इसे अमान्य() विधि से पहले बुलाया।

यहाँ एक खड़ी LinearLayout के लिए कोड है:

private void measure() { 
    if (this.getOrientation() == LinearLayout.VERTICAL) { 
     int h = 0; 
     int w = 0; 
     this.measureChildren(0, 0); 
     for (int i = 0; i < this.getChildCount(); i++) { 
      View v = this.getChildAt(i); 
      h += v.getMeasuredHeight(); 
      w = (w < v.getMeasuredWidth()) ? v.getMeasuredWidth() : w; 
     } 
     height = (h < height) ? height : h; 
     width = (w < width) ? width : w; 
    } 
    this.setMeasuredDimension(width, height); 
} 
+0

पर आपको ऊंचाई, चौड़ाई कहाँ मिली? –

0

मैं बहुत समय खर्च भी इस समस्या को हल करने के लिए। और मैं कोड की 3 लाइनों में ताज़ा LinearLayout की एक सरल विधि पाया

आप style.xml

<color name="transparent">#00000000</color> 

में और कोड में transperent रंग सेट करना होगा सिर्फ पृष्ठभूमि

LinearLayout ll = (LinearLayout) findViewById(R.id.noteList); 
ll.setBackgroundColor(getResources().getColor(R.color.transparent)); 
ll.invalidate(); 

स्थापित करने के लिए फोन यदि आपके पास खींचने योग्य पृष्ठभूमि कॉल

ll.setBackgroundResource(R.drawable.your_drawable); 
संबंधित मुद्दे