Adición dinámica de un niño a LinearLayout con la obtención de la posición de cada niño

Tengo un problema con la posición del niño de LinearLayout . Primero estoy agregando dinámicamente una serie de botones y luego estoy tratando de devolver el índice de cada niño y mostrarlo en un TextView . Aquí estoy compartiendo código:

Java fuente :

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 estructura :

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

Recursos :

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

La adición dinámica está bien, pero la forma en que estoy configurando OnClickListener produce algún error. Cualquier ayuda será útil! El propósito de eso es si quiero agregar uno o más botones a la HorizontalScrollView no ser necesario para editar muchos archivos, y sólo para ir a sting.xml y crear un nuevo elemento en la matriz de categorías !

Esto es lo que produjo 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 

Para aclarar – la aplicación se inicia sin errores, pero cuando hago clic en un botón que produce esta línea del registro anterior:

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

Y esto es de depurador :

 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) 

Tu problema es recursos …. usas el método setText (int) (que index es int …) que busca recursos y no string, no es StringBuilder para el cual puedes lanzar cualquier tipo y obtener una cadena. Necesita reemplazar

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

con

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

Y si quieres incluso un poco de eficiencia:

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

Debes setContentView antes de iniciar findViewById

 setContentView(R.layout.main); tv = (TextView) findViewById(R.id.text); 
  • Android Web App: Posición: fijo roto?
  • ¿Hay una forma de compensar una vista desde el centro en Android?
  • Textview en el botón (arriba), no funciona en Android 5 (API 21)
  • getSelectedItemPosition () de un spinner siempre devuelve 0
  • ¿Cuál es el propósito de item-id en Android ListView Adapter?
  • android detecta si el usuario ha rozado
  • ViewPager Adapter getItem siempre llamado para el índice 0 y 1
  • RecyclerView - ¿Cómo suavizar desplazamiento a la parte superior del elemento en una posición determinada?
  • Smooth Scroll para GridView
  • ¿Cómo rastrear la posición de un dispositivo Android en un edificio?
  • ArrayAdapter.getPosition (item) Returns ¿Qué?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.