2010-12-28 14 views
5

A continuación se muestra un enlace al error que estoy experimentando con mi aplicación Android. En lugar de tratar de explicarlo a través de un enorme muro de texto, pensé que un video simple sería mucho más directo y más fácil de entender.Error con Android spinner en 2.2 relacionado con el diseño de disposición

http://www.youtube.com/watch?v=9V3v854894g

he estado golpeando mi cabeza contra una pared de este problema por un día y medio. Solo encontré que podría resolverse cambiando el diseño XML recientemente, lo cual no tiene absolutamente ningún sentido para mí. No tengo idea de cómo solucionarlo correctamente, o una forma de evitar el problema ya que necesito los diseños anidados en mi aplicación.

¡Gracias a todos por toda su ayuda!

Aquí está el código:

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.Spinner; 
import android.widget.AdapterView.OnItemSelectedListener; 

public class Builder extends Activity { 
    private Spinner mCompSelect; 
    private Spinner mNameSelect; 
    private int[] mCompColorAsBuilt; 
    private int mComponent; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.builder); 

     mCompColorAsBuilt = new int[3]; 

     //Attach our objects 
     mCompSelect = (Spinner) findViewById(R.id.component); 
     mNameSelect = (Spinner) findViewById(R.id.component_name); 

     //Attach an adapter to the top spinner 
     ArrayAdapter<CharSequence> a = ArrayAdapter.createFromResource(this, R.array.cc_components, android.R.layout.simple_spinner_item); 
     a.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     mCompSelect.setAdapter(a); 
     //Create a listener when the top spinner is clicked 
     mCompSelect.setOnItemSelectedListener(new OnItemSelectedListener() { 
      public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
       //Save the position 
       mComponent = position; 
       //Create a new adapter to attach to the bottom spinner based on the position of the top spinner 
       int resourceId = Builder.this.getResources().getIdentifier("component"+Integer.toString(mComponent)+"_color", "array", Builder.this.getPackageName());  
       ArrayAdapter<CharSequence> a = ArrayAdapter.createFromResource(Builder.this, resourceId, android.R.layout.simple_spinner_item); 
       a.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
       mNameSelect.setAdapter(a); 
       //Set the position of the bottom spinner to the saved position 
       mNameSelect.setSelection(mCompColorAsBuilt[mComponent]); 
      } 
      public void onNothingSelected(AdapterView<?> parent) { 

      } 
     }); 

     //Attach an adapter to the bottom spinner 
     int resourceId = this.getResources().getIdentifier("component"+Integer.toString(mComponent)+"_color", "array", this.getPackageName());  
     ArrayAdapter<CharSequence> b = ArrayAdapter.createFromResource(this, resourceId, android.R.layout.simple_spinner_item); 
     b.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     mNameSelect.setAdapter(b); 
     mNameSelect.setOnItemSelectedListener(new OnItemSelectedListener() { 
      public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {  
       //Save the position of the bottom spinner 
       mCompColorAsBuilt[mComponent] = position; 
      } 
      public void onNothingSelected(AdapterView<?> parent) { 
      } 
     }); 
    } 
} 

XML

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <Spinner 
     android:id="@+id/component" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_toLeftOf="@+id/finish" 
     android:drawSelectorOnTop="true" 
     android:prompt="@string/component_spinner" /> 

    <LinearLayout 
     android:orientation="horizontal" 
     android:layout_alignParentBottom="true" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" > 

     <Spinner 
      android:id="@+id/component_name" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:drawSelectorOnTop="true" 
      android:prompt="@string/component_name_spinner" /> 
    </LinearLayout> 
</RelativeLayout> 

Respuesta

1

Como truco, intente llamar invalidate() en el Spinner afectados. Primero, intente después de llamar al setSelection(). Si eso falla, intente usar postDelayed() en el Spinner para llamar al invalidate() un poco más tarde (por ejemplo, 50 ms).

Además, lo animo a crear un proyecto de demostración con dos actividades (o tal vez solo una actividad con dos diseños) que ilustre este comportamiento, y publíquelo y una explicación en http://b.android.com.

+0

Intenté ambos y desafortunadamente terminé con el mismo resultado. Me diste una idea para evitar el problema. Puedo configurar el spinner inferior en el valor incorrecto y usar un postDelayed() para volverlo a establecer en el valor correcto. No es bonito, pero parece haber hecho el truco por el momento. Voy a poner un informe de errores juntos este fin de semana. ¡Gracias por tu ayuda! – user432209

Cuestiones relacionadas