2010-12-28 10 views
5

Di seguito è riportato un collegamento al bug che sto riscontrando con la mia applicazione Android. Piuttosto che cercare di spiegarlo tramite un enorme muro di testo, ho pensato che un semplice video sarebbe molto più diretto e più facile da capire.Bug con spinner Android in 2.2 relativo alla disposizione del layout

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

Sono stato battendo la testa contro un muro su questo problema per un giorno e mezzo. Ho solo trovato che poteva essere risolto modificando il layout XML di recente che non ha assolutamente senso per me. Non ho idea di come correggerlo correttamente, o un modo per bandire il problema poiché ho bisogno dei layout nidificati nella mia applicazione.

Grazie a tutti per il vostro aiuto!

Ecco il codice:

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> 

risposta

1

Come un hack, provare a chiamare invalidate() sul colpiti Spinner. Innanzitutto, prova dopo aver chiamato setSelection(). Se fallisce, prova a usare su Spinner per chiamare un po 'più tardi invalidate() (ad es. 50ms).

Inoltre, vi incoraggio a creare un progetto dimostrativo con due attività (o forse solo l'attività con due layout) che illustra questo comportamento, e pubblicarlo e una spiegazione a http://b.android.com.

+0

Ho provato entrambi e purtroppo ho terminato con lo stesso risultato. Mi hai dato l'idea di bandire il problema. Posso impostare lo spinner inferiore sul valore sbagliato e usare un PostDelayed() per riportarlo al valore corretto. Non è bello ma sembra aver fatto il trucco per ora. Metterò una segnalazione di bug insieme questo fine settimana. Grazie per l'aiuto! – user432209

Problemi correlati