Динамическое добавление ребенка в LinearLayout с получением позиции каждого ребенка

У меня проблема с положением ребенка LinearLayout . Сначала я добавляю динамически несколько кнопок, а затем я пытаюсь вернуть индекс каждого дочернего элемента и отображать его в TextView . Здесь я использую код:

Источник java :

private String[] categories; private LinearLayout ll; private TextView tv; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); categories = getResources().getStringArray(R.array.categories); tv = (TextView) findViewById(R.id.text); ll = (LinearLayout) findViewById(R.id.hsvLinearLayout); for(int i = 0; i < categories.length; i++) { Button btn = new Button(this); btn.setText(categories[i]); btn.setOnClickListener(buttonClick); ll.addView(btn); } } OnClickListener buttonClick = new OnClickListener() { public void onClick(View v) { tv.setText(ll.indexOfChild(v)); } }; 

Структура xml :

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent" > <HorizontalScrollView android:id="@+id/Footer" android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:scrollbars="none" android:fadingEdge="none" > <LinearLayout android:id="@+id/hsvLinearLayout" android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" > </LinearLayout> </HorizontalScrollView> <TextView android:id="@+id/text" android:layout_width="fill_parent" android:layout_height="wrap_content" /> 

Ресурсов :

 <string name="today">Today</string> <string name="life">Life</string> <string name="corner">Corner</string> <string name="banks">Banks</string> <string name="it">IT</string> <string name="fun">Fun</string> <array name="categories"> <item>@string/today</item> <item>@string/life</item> <item>@string/corner</item> <item>@string/banks</item> <item>@string/it</item> <item>@string/fun</item> </array> 

Динамическое добавление прекрасно, но способ, которым я устанавливаю OnClickListener, вызывает некоторую ошибку. Любая помощь будет полезна! Целью этого является, если я хочу добавить одну или несколько кнопок в HorizontalScrollView, чтобы не было необходимости редактировать многие файлы, и просто перейти в sting.xml и создать новый элемент в категории-массиве !

Это то, что выпустил LogCat :

 07-12 22:37:17.680: INFO/System.out(331): waiting for debugger to settle... 07-12 22:37:17.900: INFO/System.out(331): debugger has settled (1441) 07-12 22:37:20.870: INFO/ActivityManager(61): Displayed activity com.test/.TestDynam: 10203 ms (total 10203 ms) 07-12 22:37:25.552: WARN/ResourceType(331): No package identifier when getting value for resource number 0x00000000 07-12 22:37:26.871: DEBUG/dalvikvm(132): GC freed 190 objects / 8976 bytes in 901ms 

Чтобы уточнить – приложение запускается без каких-либо ошибок, но когда я нажимаю кнопку, он выводит эту строку из приведенного выше журнала:

 07-12 22:37:25.552: WARN/ResourceType(331): No package identifier when getting value for resource number 0x00000000 

И это от отладчика :

 TestDynam [Android Application] DalvikVM[localhost:8611] Thread [<3> main] (Suspended (exception Resources$NotFoundException)) ViewRoot.handleMessage(Message) line: 1704 ViewRoot(Handler).dispatchMessage(Message) line: 99 Looper.loop() line: 123 ActivityThread.main(String[]) line: 4203 Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method] Method.invoke(Object, Object...) line: 521 ZygoteInit$MethodAndArgsCaller.run() line: 791 ZygoteInit.main(String[]) line: 549 NativeStart.main(String[]) line: not available [native method] Thread [<13> Binder Thread #2] (Running) Thread [<11> Binder Thread #1] (Running) 

Ваша проблема в ресурсах … вы используете метод setText (int) (этот индекс является int …), который ищет ресурсы, а не строку, это не StringBuilder, для которого вы можете выкинуть любой тип и получить строку. Вам нужно заменить

tv.setText (ll.indexOfChild (v));

с

tv.setText (Integer.toString (ll.indexOfChild (v)));

И если вы хотите даже немного эффективности:

 public class TestActivity extends Activity { private String[] categories; private LinearLayout ll; private TextView tv; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); categories = getResources().getStringArray(R.array.categories); tv = (TextView) findViewById(R.id.text); ll = (LinearLayout) findViewById(R.id.hsvLinearLayout); for(int i = 0; i < categories.length; i++) { Button btn = new Button(this); btn.setText(categories[i]); btn.setOnClickListener(buttonClick); ll.addView(btn); int idx = ll.indexOfChild(btn); btn.setTag(Integer.toString(idx)); } } OnClickListener buttonClick = new OnClickListener() { public void onClick(View v) { String idxStr = (String)v.getTag(); tv.setText(idxStr); } }; } 

Вы должны установитьContentView перед запуском findViewById

 setContentView(R.layout.main); tv = (TextView) findViewById(R.id.text);