2012-07-18 21 views
8

Aynı TextView'ı şişirme ve yeniden kullanma konusunda bir sorunum var.
Aynı metin görüntüsünün üzerine tekrar tekrar yazmayı denemek gibi bir şey ya da bir şey yapamaz mı? İşte Görünümü birden çok kez şişirmek için kullanın

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" /> 

Bu alıyorum hata im olduğunu ve onun satırda: 51, şudur: Tek bir eklemeye çalışıyoruz 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) 

cevap

16

asla aslında Faaliyet herhangi Görüntüleme ekliyoruz. Yeni TableRows oluşturuyor ve onlara TextView'ler ekliyorsunuz, ancak satırları hiçbir şeye eklemiyorsunuz. Eğer R.layout.days_monday_inflate bir TableLayout varsayarsak, öncelikle o görünüme (TableLayout layout = (TableLayout)mainLayout.findViewById(R.id.my_table_layout_id)) bir referans almak ve sonra bu TableLayout Her bir satırı eklemek gerekir: Ben hiç değilse XML tam düzenini kurma öneriyoruz rağmen

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); 
} 

dinamik olarak gerekli olmadıkça, mümkün. Ayrıca, yalnızca satır başına bir TextView ekliyorsanız, sadece bir LinearLayout kullanarak daha iyisiniz, öneririm. Benim durumumda

+0

Teşekkürler çok! Yaklaşık 2 saattir bununla oturmak, çirkin olmaktan çekiniyor. Ama şimdi benim uygulama üzerinde gelişmeye devam edebilirsiniz, harika !! – JussT

+2

Unutulmaması gereken bir şey, bu boşluğu şişirdiğinizde geçirmenizdir, çünkü bir görüntüleme grubuna eklemeyi denerseniz, inflate() görünüm grubunu döndürür ve findViewById öğeniz yine de kimliğin ilk örneğini döndürmez. yeni bir tane. – MikeHelland

+4

@mikethematrix Aslında, şimdi null geçmenin yanlış bir yaklaşım olduğunu anlıyorum.Aslında ana düzeni içeriye aktarmalısınız, ancak aynı zamanda düzeni doğrudan dizine eklemeyi engellemek için son parametrede 'false' değerini de girmelisiniz (referans almanıza izin verir). Cevabı güncelledim. – kcoppock

0

TextView, birden fazla satıra, yani hataya neden olan şeydir. Yeni bir TextView almak için layout_number'i her defasında yeniden doldurmanız gerekir. Ben senin layout_number dosyasında bulunan, ancak burada ne var kapalı dayanır emin değilim

, daha iyi olabilir gibi

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

aynı hatayı eğer olsun 'number = new TextView (this);' kullanarak hata, '' number.setText (Integer.toString (i)); ' – JussT

0

ala döngü içinde yeni TextView'lar yaratmak için hizmet görünüyor bu deneyin :

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

; Artık 50. satırdadır. Artık hiçbir hata alamıyorum ama hiçbir şey gösterilmiyor. Ekran, çünkü benim 'R.layout.days_monday_inflate' içinde TableLayout hedefleme değil mi? – JussT

+0

Bunu merak ediyordum, bazı kodları dışarıda bıraktığını sanıyordum. TableRow örneklerinizi TableLayout'a eklemeniz gerekir. Örneğin. TableLayout tableLayout = yeni TableLayout (bu); ... tableLayout.addView (satır); <- tablo satırını ekleyin. – azgolfer

+0

Bunu her bir döngü içi döngüde mi yoksa for döngüsümden sonra mı yapmalıyım? Benim days_monday_inflate içinde bir TableLayout var çünkü – JussT

2

, setTag (i) işe yaramadı, düzen şişirme sonra ama böyle üst görünümüne eklemeden önce kimliği değişen ne çalıştı:

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); 
İlgili konular