2010-07-08 21 views
96

पर एक टेक्स्टव्यू जोड़ें I कोड में मेरे xml- परिभाषित लेआउट में TextViews जोड़ने का प्रयास कर रहा हूं। मेरे पास एक एक्सएमएल शीट है, जहां Views बहुत सारे परिभाषित किए गए हैं।एंड्रॉइड: रैखिक लेआउट प्रोग्रामेटिक रूप से

View linearLayout = findViewById(R.id.info); 
    //LinearLayout layout = (LinearLayout) findViewById(R.id.info); 


    TextView valueTV = new TextView(this); 
    valueTV.setText("hallo hallo"); 
    valueTV.setId(5); 
    valueTV.setLayoutParams(new LayoutParams(
      LayoutParams.FILL_PARENT, 
      LayoutParams.WRAP_CONTENT)); 

    ((LinearLayout) linearLayout).addView(valueTV); 

लेकिन मैं केवल:

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

और इस लेआउट में, मैं अपने TextView जोड़ना चाहते: लेकिन मैं, कोड में कुछ दृश्यों को जोड़ने के लिए तो एक एक्सएमएल-शीट में एक LinearLayout बनवाने के निम्न त्रुटि संदेश प्राप्त करें:

: java.lang.ClassCastException: android.widget.TextView 

मैं यह कैसे कर सकता हूं?

आपकी मदद के लिए धन्यवाद। मार्टिन

+0

किस लाइन के लिए अपवाद है? यह LinearLayout कलाकार से होना चाहिए, क्या आप निश्चित हैं कि linearLayout चर एक LinearLayout है और एक TextView नहीं है? इसके अलावा आपको आईडी निर्दिष्ट नहीं करना चाहिए क्योंकि आप गारंटी नहीं दे सकते कि यह अद्वितीय होगा। –

+1

आप सही हैं, linearLayout एक टेक्स्ट व्यू है, लेकिन क्यों? मैंने इसे xml-file में एक LinearLayout के रूप में परिभाषित किया है ... – Martin

+1

सुनिश्चित करें कि आप वास्तव में ऊपर दिखाए गए XML पर चल रहे हैं। 'SetContentView (R.layout.your_xml_layout) है;' वास्तव में सही xml लोड हो रहा है? क्या आपके पास अन्य एक्सएमएल लेआउट हैं जहां आप 'android: id =" @ + id/info "का उपयोग करते हैं, जो टेक्स्टव्यू होता है? – Rodja

उत्तर

82

का उपयोग कर

LinearLayout linearLayout = (LinearLayout)findViewById(R.id.info); 
... 
linearLayout.addView(valueTV); 

भी सुनिश्चित करें कि आप परम लेआउट बना रहे हैं LinearLayout.LayoutParams कर रहे हैं कोशिश ...

+0

फिर से एक अपवाद है, क्योंकि findViewById एक टेक्स्ट व्यू देता है। पर क्यों? मैं इसे LinearLayout आईडी के साथ लाता हूं .... आपका क्या मतलब है: यह भी सुनिश्चित करें कि आपके द्वारा बनाए जा रहे लेआउट पैराम हैं LinearLayout.LayoutParams ... ??? – Martin

+0

यह कुछ भी क्यों बदलेगा? यह सब कुछ बाद में जल्द ही डाला जाता है, जिसका एक ही प्रभाव होना चाहिए। – yesennes

3

आप के माध्यम से इसे लेआउट संसाधन, नहीं एक है लेआउट का उपयोग करने की जरूरत है आईडी संसाधन जो अद्वितीय गारंटी नहीं है। संसाधन संदर्भ R.layout.my_cool_layout जैसा दिखना चाहिए जहां आपका उपरोक्त XML लेआउट res/layout/my_cool_layout.xml में संग्रहीत है।

56

अरे मैंने आपके कोड की जांच की है, आपके कोड में कोई गंभीर त्रुटि नहीं है।

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

इस Stackoverflow.java

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

public class Stackoverflow extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     View linearLayout = findViewById(R.id.info); 
     //LinearLayout layout = (LinearLayout) findViewById(R.id.info); 

     TextView valueTV = new TextView(this); 
     valueTV.setText("hallo hallo"); 
     valueTV.setId(5); 
     valueTV.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT)); 

     ((LinearLayout) linearLayout).addView(valueTV); 
    } 
} 

है प्रतिलिपि इस कोड, और इसे चलाने के -:

main.xml: यह पूरा कोड है। यह पूरी तरह से त्रुटि मुक्त है। ले देखभाल ...

+0

क्या होगा यदि मैं निम्नलिखित TextView करना चाहते थे: ' ' – Si8

+0

+1। यह उत्तर @ बेन की तुलना में काफी बेहतर है क्योंकि इसमें लेआउट पैराम्स का एक उदाहरण है और 'टेक्स्ट व्यू' के बाकी गुणों को कैसे प्रारंभ किया गया है। इसे एक उत्तर के रूप में चिह्नित किया जाना चाहिए। – Subby

+3

नोट: 2015 में कॉन्स FILL_PARENT को बहिष्कृत किया गया है, आपको इसके बजाय MATCH_PARENT का उपयोग करना चाहिए। –

17

आप इस तरह प्रोग्राम के रूप में अपने रैखिक जमाव के बारे में TextView जोड़ सकते हैं:

LinearLayout linearLayout = (LinearLayout) findViewById(R.id.mylayout); 
TextView txt1 = new TextView(MyClass.this); 
linearLayout.setBackgroundColor(Color.TRANSPARENT); 
linearLayout.addView(txt1); 
+0

MyClass.this क्या है? मैं एंड्रॉइड विकास के लिए नया हूँ; क्या मुझे "माईक्लास" के लिए मेरी खंड वर्ग का नाम बदलना है? – drusepth

+0

MyClass.this एक संदर्भ है और एक टेक्स्ट व्यू संदर्भ में लेता है –

+1

बस स्पष्टीकरण के लिए: 'MyClass.this', ज्यादातर मामलों में, 'this' जैसा ही है। हालांकि, यदि आप नेस्टेड क्लास में हैं और "बाहरी" वर्ग के उदाहरण तक पहुंचना चाहते हैं, तो क्लास का नाम निर्दिष्ट करना होगा, जो एंड्रॉइड में ईवेंट के लिए कॉलबैक को परिभाषित करते समय बहुत आम है। – drigoangelo

0
LinearLayout.LayoutParams layoutParams ; 
layoutParams= new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); 
-2

यहाँ जहां अपवाद तब होता है

((LinearLayout) linearLayout).addView(valueTV); 

addView विधि एक में ले जाता है प्रकार View, का पैरामीटर। इसलिए, स्पष्ट रूप से एक व्यू ऑब्जेक्ट में valueTv ऑब्जेक्ट टाइप करें।

इसलिए, को सही कोड होगा:

((LinearLayout) linearLayout).addView((TextView)valueTV); 
+0

क्या आपने इसका परीक्षण किया है? – mrres1

+0

हाँ, मेरे पास है। और यह पूरी तरह से काम करता है! या तुमने कोशिश की? – user3509153

+0

नहीं, मुझे यकीन नहीं है। – mrres1

14
for(int j=0;j<30;j++) { 
    LinearLayout childLayout = new LinearLayout(MainActivity.this); 
    LinearLayout.LayoutParams linearParams = new LinearLayout.LayoutParams(
     LayoutParams.WRAP_CONTENT, 
     LayoutParams.WRAP_CONTENT); 
    childLayout.setLayoutParams(linearParams); 

    TextView mType = new TextView(MainActivity.this); 
    TextView mValue = new TextView(MainActivity.this); 

    mType.setLayoutParams(new TableLayout.LayoutParams(
     LayoutParams.WRAP_CONTENT, 
     LayoutParams.WRAP_CONTENT, 1f)); 
    mValue.setLayoutParams(new TableLayout.LayoutParams(
     LayoutParams.WRAP_CONTENT, 
     LayoutParams.WRAP_CONTENT, 1f)); 

    mType.setTextSize(17); 
    mType.setPadding(5, 3, 0, 3); 
    mType.setTypeface(Typeface.DEFAULT_BOLD); 
    mType.setGravity(Gravity.LEFT | Gravity.CENTER); 

    mValue.setTextSize(16); 
    mValue.setPadding(5, 3, 0, 3); 
    mValue.setTypeface(null, Typeface.ITALIC); 
    mValue.setGravity(Gravity.LEFT | Gravity.CENTER); 

    mType.setText("111"); 
    mValue.setText("111"); 

    childLayout.addView(mValue, 0); 
    childLayout.addView(mType, 0); 

    linear.addView(childLayout); 
} 
+0

यह स्वीकार्य उत्तर होना चाहिए! –

0

आप गतिशील LinearLayout को TextView जोड़ने के लिए यह करने के लिए कुछ इसी तरह का उपयोग करना चाहिए:

LinearLayout linearLayout = getActivity().findViewById(R.id.infoLayout); 

TextView valueTV = new TextView(context); 
valueTV.setText("hallo hallo"); 
valueTV.setId(Integer.parseInt("5")); 
valueTV.setLayoutParams(new LinearLayout.LayoutParams(
     LinearLayout.LayoutParams.FILL_PARENT, 
     LinearLayout.LayoutParams.WRAP_CONTENT)); 

linearLayout.addView(valueTV); 

getActivity() के अंदर के लिए प्रयोग किया जाता है टुकड़े, आप अंदर या प्रत्येक इंस्टेंस के समान संदर्भ या कुछ भी उपयोग कर सकते हैं।

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