Autore Topic: Invocato onItemSelected() dopo pressione Button  (Letto 267 volte)

Offline Sokrates

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 10
  • Sistema operativo:
    Windows 7 64bit
Invocato onItemSelected() dopo pressione Button
« il: 06 Ottobre 2014, 00:55:22 CEST »
0
Ciao a tutti,

ho da poco cominciato a sviluppare in Android (qualche anno fa programmavo in Java) e mi sono subito scontrato con un problema.

Sto facendo un'app di test per leggere le periferiche usb connesse al mio tablet Nexus 10: ho inserito un pulsante "Scan" che crea la lista dei dispositivi e la inserisce in uno spinner.

Alla pressione del tasto lo spinner si dovrebbe popolare con la lista dei dispositivi usb. Ho definito il metodo onSelectedItem che vorrei utilizzare in seguito alla pressione di un elemento dello spinner. Tuttavia quando premo il tasto scan viene lanciato anche il metodo onSelectedItem. Credo di aver fatto casiono con i listener.

Mi sapete dare una mano? di seguito il codice:

Codice (XML): [Seleziona]
package com.tbt.usbtest;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Vector;

import android.app.Activity;
import android.app.ActionBar;
import android.app.Fragment;
import android.content.Context;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbManager;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.Spinner;
import android.os.Build;

public class UsbMainActivity extends Activity implements OnItemSelectedListener{

        ArrayList<String> deviceNames=new ArrayList<String>();
        ArrayAdapter<String> deviceNameAdapter;
       
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_usb_main);

                if (savedInstanceState == null) {
                        getFragmentManager().beginTransaction()
                                        .add(R.id.container, new PlaceholderFragment()).commit();
                }
        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {

                // Inflate the menu; this adds items to the action bar if it is present.
                getMenuInflater().inflate(R.menu.usb_main, menu);
                return true;
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
                // Handle action bar item clicks here. The action bar will
                // automatically handle clicks on the Home/Up button, so long
                // as you specify a parent activity in AndroidManifest.xml.
                int id = item.getItemId();
                if (id == R.id.action_settings) {
                        return true;
                }
                return super.onOptionsItemSelected(item);
        }
       
       
        public void onItemSelected(AdapterView<?> parent, View view,
            int pos, long id) {
               
                EditText txt = (EditText) findViewById(R.id.console);
                txt.setText("Prova2");
                Log.d("USBTest","Select Item");
               
                // An item was selected. You can retrieve the selected item using
        // parent.getItemAtPosition(pos)
    }
       
    public void onNothingSelected(AdapterView<?> parent) {
        // Another interface callback
    }

       
        public void scanUSB(View arg0) {
               
                UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
                HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
               
                Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
               
                //Vector<String> deviceNames = new Vector<String>();
                Log.d("USBTest","Push Scan");
               
                while(deviceIterator.hasNext()){
                    UsbDevice device = deviceIterator.next();
                    deviceNames.add(device.toString());

                }
               
                Spinner uList = (Spinner) findViewById(R.id.usbList);
                deviceNameAdapter=new ArrayAdapter<String>(this,
                    android.R.layout.simple_list_item_1,
                    deviceNames);

                uList.setAdapter(deviceNameAdapter);
                uList.setOnItemSelectedListener(this);
               
        }

        /**
         * A placeholder fragment containing a simple view.
         */
        public static class PlaceholderFragment extends Fragment {

                public PlaceholderFragment() {
                }

                @Override
                public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                Bundle savedInstanceState) {
                        View rootView = inflater.inflate(R.layout.fragment_usb_main,
                                        container, false);
                        return rootView;
                }
        }

}

Offline tonno16

  • Utente storico
  • *****
  • Post: 1197
  • Respect: +58
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Invocato onItemSelected() dopo pressione Button
« Risposta #1 il: 06 Ottobre 2014, 07:38:48 CEST »
0
Io metterei place holder in una classe apposita. Ovvero un altro file. Poi implementare OnSelectedItem sul fragmebt. Nel tuo codice sembra che tu abbia messo un metodo nel xml. Io metterei direttamente lo spinner inizializzato con una lista che ovviamente è vuota. Dato che te gli hai settato un adapter, Quando tappi il bottone la lista si riempie e ti conseguenza anche lo spinner.

iClaude

  • Visitatore
Re:Invocato onItemSelected() dopo pressione Button
« Risposta #2 il: 06 Ottobre 2014, 10:34:46 CEST »
0
Quello è il comportamento di default dello Spinner: non c'è nulla di sbagliato nel tuo codice.
Per ottenere ciò che vuoi devi fare "a mano", tipo tenere una variabile che registra quando il metodo onItemSelected è invocato tramite la pressione del bottone oppure tramite selezione di un elemento e quindi agire di conseguenza.

Offline Sokrates

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 10
  • Sistema operativo:
    Windows 7 64bit
Re:Invocato onItemSelected() dopo pressione Button
« Risposta #3 il: 06 Ottobre 2014, 10:48:08 CEST »
0
Ok. Grazie 1000 ora è più chiaro. É possibile capire nel metodo onitemselect se questo è stato scatenato da un button o da uno spinner ?


Inviato dal mio iPhone utilizzando Tapatalk

iClaude

  • Visitatore
Re:Invocato onItemSelected() dopo pressione Button
« Risposta #4 il: 06 Ottobre 2014, 10:51:30 CEST »
0
Nel metodo onItemSelected  ovviamente no.
Però potresti creare una variabile che assume un certo valore alla pressione del bottone. In onItemSelected controlli tale valore, e subito dopo lo reimposti al valore di default.
Questa è solo un'idea al volo.

Offline Sokrates

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 10
  • Sistema operativo:
    Windows 7 64bit
Re:Invocato onItemSelected() dopo pressione Button
« Risposta #5 il: 06 Ottobre 2014, 10:53:28 CEST »
0
Ok, allora x il momento faccio così oppure creo un oggetto a parte per lo spinner. Grazie a tutti x le info.


Inviato dal mio iPhone utilizzando Tapatalk