Ciao a tutti, mi sono incagliato in un problema su una cosa che pensavo fosse banale ovvero aggiungere items ad uno Spinner in Android.

Ho il seguente codice:

main.xml
codice:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
   <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dip"
        android:text="@string/device_prompt"
    />
    <Spinner 
        android:id="@+id/spinner"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:prompt="@string/device_prompt"
    />
</LinearLayout>
strings.xml
codice:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello World, myApp!</string>
    <string name="app_name">myApp</string>
    
    <string name="device_prompt">Choose a device to connect</string>
     <string-array name="device_array">
     </string-array>
</resources>
myApp.java
codice:
BlueAndMeConnection conn;
	
	private Spinner spinner;
	private ArrayAdapter<CharSequence> adapter;
	private Set<BluetoothDevice> devices;
	private int selectedDeviceToConnect;
		
	/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
    	String function = "onCreate -> ";
    	
    	super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        try {
          conn = new BlueAndMeConnection(this);
          spinner = (Spinner) findViewById(R.id.spinner);
	  adapter = ArrayAdapter.createFromResource(
	            this, R.array.device_array, android.R.layout.simple_spinner_item); 
          adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
	      
	      spinner.setAdapter(adapter);
	      
              // search for bluetooth paired devices
	      devices = conn.getPairedDevices();
	      if (devices.size() > 0) {
	    	  Log.d(TESTER_TAG, function+"devices.size() = "+devices.size());
	    	  for (BluetoothDevice device : devices) {
	    		  Log.d(TESTER_TAG, function+"Prima di add");
	    		  adapter.add(device.getName()); 
	    	  }
	    	  spinner.setOnItemSelectedListener(new MyOnItemSelectedListener());
	      }
	      else {
	    	  Log.d(TESTER_TAG, function+"devices.size() = 0");
	      }
        }
        catch (Exception e) {
        	Log.d(TESTER_TAG, function+"Errore: "+e.toString());
        }
    }
    
    public class MyOnItemSelectedListener implements OnItemSelectedListener {

	    public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
	    	selectedDeviceToConnect = pos;
	    	Toast.makeText(parent.getContext(), "The device is " +
	          parent.getItemAtPosition(pos).toString(), Toast.LENGTH_LONG).show();
	    }

	    public void onNothingSelected(AdapterView parent) {
	      // Do nothing.
	    }
	}
se faccio cosi' la adapter.add mi da un errore di tipo: UnsupportedOperationException

Su internet ho trovato quest'altra soluzione:

codice:
BlueAndMeConnection conn;
	
	private Spinner spinner;
	private ArrayAdapter<CharSequence> adapter;
	private Set<BluetoothDevice> devices;
	private int selectedDeviceToConnect;
	List<CharSequence> dev = new ArrayList<CharSequence>();
	
	/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
    	String function = "onCreate -> ";
    	
    	super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        try {
          conn = new BlueAndMeConnection(this);
          spinner = (Spinner) findViewById(R.id.spinner);
	  
          adapter = new ArrayAdapter<CharSequence>(this,
                  R.array.device_array, dev);
	      adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
	      
	      // spinner.setAdapter(adapter);
	      Log.d(TESTER_TAG, function+"Fin qui OK!");
	      // search for bluetooth paired devices
	      devices = conn.getPairedDevices();
	      if (devices.size() > 0) {
	    	  Log.d(TESTER_TAG, function+"devices.size() = "+devices.size());
	    	  for (BluetoothDevice device : devices) {
	    		  Log.d(TESTER_TAG, function+"Prima di add");
	    		  adapter.add(device.getName()); 
	    	  }
	    	  spinner.setAdapter(adapter);
	    	  // spinner.setOnItemSelectedListener(new MyOnItemSelectedListener());
	      }
	      else {
	    	  Log.d(TESTER_TAG, function+"devices.size() = 0");
	      }
        }
        catch (Exception e) {
        	Log.d(TESTER_TAG, function+"Errore: "+e.toString());
        }
    }
    
    public class MyOnItemSelectedListener implements OnItemSelectedListener {

	    public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
	    	selectedDeviceToConnect = pos;
	    	Toast.makeText(parent.getContext(), "The device is " +
	          parent.getItemAtPosition(pos).toString(), Toast.LENGTH_LONG).show();
	    }

	    public void onNothingSelected(AdapterView parent) {
	      // Do nothing.
	    }
	}
In questo caso da log sembra che la adapter.add vada bene pero' poi l'Activity crasha e dal logcat mi torna un errore di questo genere:



codice:
D/AndroidRuntime(15249): Shutting down VM

W/dalvikvm(15249): threadid=1: thread exiting with uncaught exception (group=0x4001d7d0)

E/AndroidRuntime(15249): FATAL EXCEPTION: main

E/AndroidRuntime(15249): android.content.res.Resources$NotFoundException: Resource ID #0x7f050000

E/AndroidRuntime(15249): 	at android.content.res.Resources.getValue(Resources.java:892)

E/AndroidRuntime(15249): 	at android.content.res.Resources.loadXmlResourceParser(Resources.java:1869)

E/AndroidRuntime(15249): 	at android.content.res.Resources.getLayout(Resources.java:731)

E/AndroidRuntime(15249): 	at android.view.LayoutInflater.inflate(LayoutInflater.java:318)

E/AndroidRuntime(15249): 	at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:332)

E/AndroidRuntime(15249): 	at android.widget.ArrayAdapter.getView(ArrayAdapter.java:323)

E/AndroidRuntime(15249): 	at android.widget.AbsSpinner.onMeasure(AbsSpinner.java:192)

E/AndroidRuntime(15249): 	at android.view.View.measure(View.java:8226)

E/AndroidRuntime(15249): 	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)

E/AndroidRuntime(15249): 	at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1012)

E/AndroidRuntime(15249): 	at android.widget.LinearLayout.measureVertical(LinearLayout.java:381)

E/AndroidRuntime(15249): 	at android.widget.LinearLayout.onMeasure(LinearLayout.java:304)

E/AndroidRuntime(15249): 	at android.view.View.measure(View.java:8226)

E/AndroidRuntime(15249): 	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)

E/AndroidRuntime(15249): 	at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)

E/AndroidRuntime(15249): 	at android.view.View.measure(View.java:8226)

E/AndroidRuntime(15249): 	at android.widget.LinearLayout.measureVertical(LinearLayout.java:526)

E/AndroidRuntime(15249): 	at android.widget.LinearLayout.onMeasure(LinearLayout.java:304)

E/AndroidRuntime(15249): 	at android.view.View.measure(View.java:8226)

E/AndroidRuntime(15249): 	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)

E/AndroidRuntime(15249): 	at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)

E/AndroidRuntime(15249): 	at android.view.View.measure(View.java:8226)

E/AndroidRuntime(15249): 	at android.view.ViewRoot.performTraversals(ViewRoot.java:801)

E/AndroidRuntime(15249): 	at android.view.ViewRoot.handleMessage(ViewRoot.java:1727)

E/AndroidRuntime(15249): 	at android.os.Handler.dispatchMessage(Handler.java:99)

E/AndroidRuntime(15249): 	at android.os.Looper.loop(Looper.java:123)

E/AndroidRuntime(15249): 	at android.app.ActivityThread.main(ActivityThread.java:4627)

E/AndroidRuntime(15249): 	at java.lang.reflect.Method.invokeNative(Native Method)

E/AndroidRuntime(15249): 	at java.lang.reflect.Method.invoke(Method.java:521)

E/AndroidRuntime(15249): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)

E/AndroidRuntime(15249): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

E/AndroidRuntime(15249): 	at dalvik.system.NativeStart.main(Native Method)

W/ActivityManager( 2478):   Force finishing activity it.tilab.carmaintenance/.CarMaintenance
Che sta succedendo? Dove sbaglio?

Ciao e grazie a chi rispondera'

Sandro