Question

    

Cette question a déjà une réponse ici:

         

J'ai une forme Android qui a besoin de se mettre à jour en fonction de certaines sélections. La forme est actuellement constituée de 2 fileurs (A et B). Spinner B pas créé jusqu'à ce que la sélection de Spinner A est faite. Une fois la sélection faite B sera affiché à la vue et son contenu dynamique rempli en fonction de la sélection d'un. Voici mon code:

public class MyForm extends Activity 
{   
    private final int SEL_ACTIVATE = 0;
    private final int SEL_DEACTIVATE = 1;

    private static final String[] actionList = {"Activate", "Deactivate" };

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        table = (TableLayout) findViewById(R.id.table);

        showListA(table);
    }

    public void showListA(View v)
    {        
        rowAction = new TableRow(this);

        Spinner spinner = new Spinner(this);
        spinner.setPrompt("Select...");
        spinner.setOnItemSelectedListener(
            new OnItemSelectedListener() 
            {
                public void onItemSelected(AdapterView<?> parent, View v, int position, long id) 
                {
                    switch (position)
                    {
                    case SEL_ACTIVATE:
                    case SEL_DEACTIVATE:
                        showListB(v);
                        break;
                    }
                }

                public void onNothingSelected(AdapterView<?> arg0) 
                {
                    // TODO Auto-generated method stub
                }
        });

        ArrayAdapter<String> adapter = new ArrayAdapter<String> (this, android.R.layout.simple_spinner_item, actionList);
        adapter.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line);
        spinner.setAdapter(adapter);

        rowAction.addView(tvAction);
        rowAction.addView(spinner);

        table.addView(rowAction, new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
    }

    ...
}

Ce code fonctionne correctement. Lorsque soit « Activer » ou « Désactiver » sont sélectionnés dans la liste, se exécute showListB() qui est très similaire à showListA() dans la façon dont il crée une nouvelle ligne qui contient l'étiquette et Spinner.

Le problème est que, par défaut, « Activation » est affiché dans la Spinner qui exécute showListB() et dès le départ, la deuxième partie de la forme est créée en fonction de l'option « Activer ». La seule solution que je peux trouver est d'ajouter un troisième champ à l'Spinner comme ceci:

private static final String[] actionList = {"None", "Activate", "Deactivate" };

...

switch (position)
{
case SEL_NONE:
    break;
case SEL_ACTIVATE:
case SEL_DEACTIVATE:
    showListB(v);
    break;
}

Cela fonctionne ... mais je ne veux pas une troisième option dans la liste. Je veux juste qu'il, par défaut, être vide ou montrer une sorte de texte « prompt » qui n'est pas une option dans la liste une fois qu'elle est pressée. Est-ce possible?

Merci

EDIT:

Contenu xml:

<Spinner
    android:id="@+id/spinnerAction"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>  
Était-ce utile?

La solution

Mes données-sizes.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="chunks">
        <item>2</item>
        <item>4</item>
        <item>8</item>
        <item>16</item>
        <item>32</item>
    </string-array>
</resources>

En main.xml:

<Spinner android:id="@+id/spinnerSize"  
android:layout_marginLeft="50px"
android:layout_width="fill_parent"                  
android:drawSelectorOnTop="true"
android:layout_marginTop="5dip"
android:prompt="@string/SelectSize"
android:layout_marginRight="30px"
android:layout_height="35px" /> 

Dans le code Java:

Spinner spinnerSize;
ArrayAdapter adapter;

...

spinnerSize = (Spinner)findViewById(R.id.spinnerSize);
adapter = ArrayAdapter.createFromResource(this, R.array.chunks, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinnerSize.setAdapter(adapter);
spinnerSize.setOnItemSelectedListener(new MyOnItemSelectedListener());

...

class MyOnItemSelectedListener implements OnItemSelectedListener {

    public void onItemSelected(AdapterView<?> parent,
        View view, int pos, long id) {
        chunkSize = new Integer(parent.getItemAtPosition(pos).toString()).intValue();
    }
    public void onNothingSelected(AdapterView<?> parent) {
      // Dummy
    }
}

Alors, bien que je peux voir 2 que mon premier élément par défaut, rien ne se passe à moins que l'utilisateur sélectionne réellement.

Hope this helps!

Autres conseils

Si vous voulez, il y a un ajout de sorcière spinnerAdapter de decorater automatiquement une valeur par défaut:



    protected class SpinnerAdapterWithNoValue implements SpinnerAdapter {

        private SpinnerAdapter _current;
        private final static String defaultValue = "Choisir";

        public SpinnerAdapterWithNoValue(SpinnerAdapter base) {
            _current = base;
        }

        @Override
        public int getCount() {
            return _current.getCount() + 1;
        }

        @Override
        public Object getItem(int position) {
            if (position == 0 || position == -1) {
                return null;
            }
            return _current.getItem(position - 1);
        }

        @Override
        public long getItemId(int position) {
            if (position == 0 || position == -1) {
                return -1;
            }
            return _current.getItemId(position - 1);
        }

        @Override
        public int getItemViewType(int position) {
            if (position == 0 || position == -1) {
                return -1;
            }
            return _current.getItemViewType(position - 1);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if (position == 0 || position == -1) {
                final TextView v = (TextView) ((LayoutInflater) getContext().getSystemService(
                        Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.spinner_text, parent, false);
                v.setText(defaultValue);
                return v;
            }
            return _current.getView(position - 1, convertView, parent);
        }

        @Override
        public int getViewTypeCount() {
            return _current.getViewTypeCount();
        }

        @Override
        public boolean hasStableIds() {
            return _current.hasStableIds();
        }

        @Override
        public boolean isEmpty() {
            return _current.isEmpty();
        }

        @Override
        public void registerDataSetObserver(DataSetObserver observer) {
            _current.registerDataSetObserver(observer);
        }

        @Override
        public void unregisterDataSetObserver(DataSetObserver observer) {
            // TODO Auto-generated method stub
            _current.unregisterDataSetObserver(observer);
        }

        @Override
        public View getDropDownView(int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub
            if (position == 0 || position == -1) {
                CheckedTextView v = (CheckedTextView) ((LayoutInflater) getContext().getSystemService(
                        Context.LAYOUT_INFLATER_SERVICE)).inflate(android.R.layout.simple_spinner_dropdown_item, parent,
                        false);
                v.setText(defaultValue);
                return v;
            }
            return _current.getDropDownView(position - 1, convertView, parent);
        }
    }


Ensuite, vous pouvez créer votre propre spinner en utilisant ce decorater:



    public class SpinnerWithNoValue extends Spinner {

        public SpinnerWithNoValue(Context context) {
            super(context);
        }

        public SpinnerWithNoValue(Context context, AttributeSet attrs) {
            super(context, attrs);
        }

        public SpinnerWithNoValue(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }

        @Override
        public void setAdapter(SpinnerAdapter orig) {
            final SpinnerAdapter adapter = new SpinnerAdapterWithNoValue(orig);
            super.setAdapter(adapter);

            try {
                final Method m = AdapterView.class.getDeclaredMethod("setNextSelectedPositionInt", int.class);
                m.setAccessible(true);
                m.invoke(this, -1);

                final Method n = AdapterView.class.getDeclaredMethod("setSelectedPositionInt", int.class);
                n.setAccessible(true);
                n.invoke(this, -1);

            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }

        /*
         * getSelectedItem renvoi null si la valeur par defaut est séléctionnée
         * 
         * @see android.widget.AdapterView#getSelectedItem()
         */
        @Override
        public Object getSelectedItem() {
            return super.getSelectedItem();
        }
    }


Il vous suffit de modifier la déclaration de spinner dans votre mise en page xml:



com.myproject.SpinnerWithNoValue


Si vous voulez, vous pouvez modifier le code pour définir le texte par défaut dans la balise de votre spinner.

Le Spinner aura toujours une sélection. Ce que vous pouvez faire est de faire quelque chose d'affichage Spinner comme « Select » ou « Sélectionnez une option » ...

Pour ce faire, vous pouvez faire vos options de liste à

actionList = {"Select", "Desactivate" }

et

public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long id) {               
        actionList[0] = "Activate";
        ...
 }

ou vous pouvez faire quelque chose de plus compliqué comme le Spinner Voir overrides ou mettre un bouton plutôt avec rien et quand il vous a cliqué créer votre spinner.

Essayez de régler cela en XML avec l'attribut invite:

android:prompt="@string/prompt"

Cela permettra également de remplir la partie supérieure de la boîte de dialogue spinner.

Je négligé cela dans la documentation. L'invite ne peut pas être appliqué directement. L'attribut rapide doit être référencé à partir d'une autre source. Essayez faisant référence à une valeur de chaîne.

Documentation d'Android:

android:prompt

Since: API Level
 The prompt to display when the spinner's dialog is shown.
 Must be a reference to another resource, in the form "@[+][package:]type:name" or to a       theme attribute in the form "?[package:][type:]name".
This corresponds to the global attribute resource symbol prompt.

Je suis juste un begginner au développement Android app, et faisait face à un problème similaire; a été en mesure de faire le tri à l'aide d'un simple cela a fonctionné pour solution qui consisterait à moi, espérons que le fait pour vous aussi:

AdmissionActivity public class étend les outils d'activité OnItemSelectedListener {

int i;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    i=0;
            .........

           }

........ .....

public void onItemSelected(AdapterView<?> parent, View view, 
        int pos, long id){

    if(i!=0){
        //do wat you want;
    }
    else i=1;
            }
            //initially the activity will be loaded and nothing  will happen (since
              // i=0); and then appropriate action will be taken since i would hav been

// changé à sumtng autre

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top