2012-07-18 15 views
8

को बढ़ाने के लिए दृश्य का उपयोग करें मुझे एक ही टेक्स्ट व्यू को बढ़ाने और पुनः उपयोग करने में कुछ समस्या है।
यह वही टेक्स्टव्यू ओवरराइट करने की कोशिश कर रहा है जैसे बार-बार या कुछ और यह ऐसा नहीं कर सकता?कई बार

LayoutInflater inflater = LayoutInflater.from(this); 
View mainlayout = inflater.inflate(R.layout.days_monday_inflate, null); 
View layout_number = inflater.inflate(R.layout.inflate_number, null); 

for (int i = 0; i < 10; i++) { 
    row = new TableRow(this); 
    number = (TextView) layout_number.findViewById(R.id.Number); 
    number.setTag(i); 
    number.setText(Integer.toString(i)); 
    row.addView(number); 
} 
setContentView(mainlayout); 

यहाँ inflate_number.xml

<TextView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/Number" 
    android:layout_width="3dp" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center|bottom" 
    android:text="1" /> 

यह त्रुटि im हो रही है और इसकी पंक्ति पर: 51 है, जो है: row.addView(number);

07-18 20:54:25.124: E/AndroidRuntime(1166): Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 07-18 20:54:25.124: E/AndroidRuntime(1166): at android.view.ViewGroup.addViewInner(ViewGroup.java:1970) 07-18 20:54:25.124: E/AndroidRuntime(1166): at android.view.ViewGroup.addView(ViewGroup.java:1865) 07-18 20:54:25.124: E/AndroidRuntime(1166): at android.view.ViewGroup.addView(ViewGroup.java:1822) 07-18 20:54:25.124: E/AndroidRuntime(1166): at android.view.ViewGroup.addView(ViewGroup.java:1802) 07-18 20:54:25.124: E/AndroidRuntime(1166): at com.trainingschedule.days.Monday.onCreate(Monday.java:50) 07-18 20:54:25.124: E/AndroidRuntime(1166): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 07-18 20:54:25.124: E/AndroidRuntime(1166): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 

उत्तर

16

आप वास्तव में अपनी गतिविधि में कोई भी दृश्य जोड़ नहीं रहे हैं। आप नए टेबलरो बना रहे हैं और उन्हें टेक्स्ट व्यू जोड़ रहे हैं, लेकिन आप कभी भी पंक्तियों को किसी भी चीज़ में नहीं जोड़ रहे हैं। आप यह मानते हुए R.layout.days_monday_inflate में एक TableLayout है, आपको पहले एक संदर्भ है कि देखने के लिए मिलना चाहिए (TableLayout layout = (TableLayout)mainLayout.findViewById(R.id.my_table_layout_id)) और फिर उस TableLayout के लिए प्रत्येक पंक्ति जोड़ें:

TableLayout layout = (TableLayout)mainLayout.findViewById(R.id.my_table_layout_id); 

for(int i = 0; i < 10; i++) { 
    row = new TableRow(this); 
    View layout_number = inflater.inflate(R.layout.inflate_number, layout, false); 
    TextView number = (TextView) layout_number.findViewById(R.id.Number); 
    number.setTag(i); 
    number.setText(Integer.toString(i)); 
    row.addView(number); 
    layout.addView(row); 
} 

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

+0

बहुत बहुत धन्यवाद! इसके साथ लगभग 2 घंटे के लिए बैठे हैं, abob abit। लेकिन अब मैं अपने आवेदन पर बढ़ना जारी रख सकता हूं, कमाल !! – JussT

+2

ध्यान देने योग्य एक बात यह है कि जब आप फुलाते हैं तो आपको उस शून्य को पार करना होगा, क्योंकि यदि आप इसे एक व्यू समूह में संलग्न करने का प्रयास करते हैं तो वहां() दृश्य समूह को वापस कर देगा और आपका findViewById अभी भी आईडी का पहला उदाहरण नहीं देगा नया। – MikeHelland

+4

@ मिकेटेमेट्रिक्स वास्तव में, अब मुझे पता है कि गुजरने का गलत तरीका गलत दृष्टिकोण है।आपको वास्तव में पैरेंट लेआउट को पास करना चाहिए, लेकिन लेआउट को तुरंत लेआउट को रोकने से रोकने के लिए अंतिम पैरामीटर के रूप में 'झूठी' में भी पास होना चाहिए (आपको इसका संदर्भ प्राप्त करने की इजाजत मिलनी चाहिए)। मैंने जवाब अपडेट कर लिया है। – kcoppock

0

आप किसी एक को जोड़ना चाहते हैं कई पंक्तियों में टेक्स्ट व्यू, जो आपकी त्रुटि उत्पन्न कर रहा है। नया टेक्स्टव्यू प्राप्त करने के लिए आपको प्रत्येक बार layout_number को फिर से भरना होगा।

मुझे यकीन है कि क्या अपने layout_number फ़ाइल के भीतर निहित है, लेकिन बंद आधारित तुम यहाँ है क्या नहीं कर रहा हूँ, ऐसा लगता है जैसे आप बेहतर हो सकता है आला

for (int i = 0; i < 10; i++) { 
    row = new TableRow(this); 
    number = new TextView(this); 
    number.setTag(i); 
    number.setText(Integer.toString(i)); 
    row.addView(number); 
} 
+0

मैं एक ही त्रुटि है, तो मिल मैं 'संख्या = नया टेक्स्ट व्यू (यह) का उपयोग कर रहा हूं; 'और त्रुटि पंक्ति 50 पर है जो अब' number.setText (Integer.toString (i)) है;' – JussT

0

अपने पाश के अंदर नए TextViews बनाने के लिए कार्य किया इस प्रयास करें :

View mainlayout = inflater.inflate(R.layout.days_monday_inflate, null); 

for (int i = 0; i < 10; i++) { 
    row = new TableRow(this); 
    View layout_number = inflater.inflate(R.layout.inflate_number, null); 
    TextView number = (TextView) layout_number.findViewById(R.id.Number); 
    number.setTag(i); 
    number.setText(Integer.toString(i)); 
    row.addView(number); 
} 
+0

अब मुझे कोई त्रुटि नहीं मिली है, लेकिन कुछ भी नहीं दिख रहा है स्क्रीन, क्या ऐसा इसलिए है क्योंकि मैं अपने 'R.layout.days_monday_inflate' में TableLayout को लक्षित नहीं कर रहा हूं? – JussT

+0

मैं इस बारे में सोच रहा था, मैंने सोचा कि आपने कुछ कोड छोड़ा है। आपको टेबललेआउट में अपने टेबलरो उदाहरण जोड़ना होगा। जैसे TableLayout tableLayout = नया टेबललाउट (यह); ... tableLayout.addView (पंक्ति); <- तालिका पंक्ति जोड़ें। – azgolfer

+0

क्या मुझे प्रत्येक फॉर-लूप सर्कल या मेरे फॉर-लूप के बाद ऐसा करने की ज़रूरत है? क्योंकि मेरे पास दिनों में tableLayout है_monday_inflate मैं – JussT

2

मेरे मामले में, setTag (i) काम नहीं किया, क्या काम किया लेआउट बढ़ा-चढ़ाकर के बाद, लेकिन इस तरह जनक दृश्य में जोड़ने से पहले आईडी बदल रहा था:

LayoutInflater inflater = LayoutInflater.from(this); 
View mainlayout = inflater.inflate(R.layout.days_monday_inflate, null); 
View layout_number = inflater.inflate(R.layout.inflate_number, null); 

for (int i = 0; i < 10; i++) { 
    row = new TableRow(this); 
    number = (TextView) layout_number.findViewById(R.id.Number); 
    number.setId(i); //THIS IS THE KEY STEP 
    number.setText(Integer.toString(i)); 
    row.addView(number); 
} 
setContentView(mainlayout); 
संबंधित मुद्दे