У меня есть проблема с раздуванием и повторным использованием одного и того же TextView.
Это похоже на попытку переписать один и тот же текст снова и снова или что-то еще, и это не может сделать это?
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 row.addView(number);
и его строка: 51, которая: row.addView(number);
07-18 20: 54: 25.124: E / AndroidRuntime (1166): вызвано: java.lang.IllegalStateException: указанный ребенок уже имеет родителя. Сначала вы должны вызвать removeView () родителя ребенка. 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)
Вы никогда не добавляете никаких видов в свою деятельность. Вы создаете новые TableRows и добавляете к ним TextViews, но никогда не добавляете строки ни к чему. Предполагая, что у вас есть TableLayout в R.layout.days_monday_inflate
, вы должны сначала получить ссылку на это представление ( 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); }
Хотя я бы рекомендовал полностью настроить ваш макет в XML, если это вообще возможно, если только это не требуется динамически. Кроме того, если вы добавляете только один TextView для каждой строки, вам лучше использовать LinearLayout, я бы предложил.
В моем случае 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);
Вы пытаетесь добавить один TextView в несколько строк, что является причиной вашей ошибки. Чтобы получить новый TextView, вам нужно каждый раз перетаскивать layout_number.
Я не уверен, что содержится в вашем файле layout_number, но основываясь на том, что у вас здесь, похоже, вам лучше было бы лучше создавать новые TextView внутри вашего цикла ala
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); }
Попробуй это:
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); }