Android Spinner - Как к выбору списка по умолчанию нет [дубликата

StackOverflow https://stackoverflow.com/questions/4424938

  •  09-10-2019
  •  | 
  •  

Вопрос

Этот вопрос уже имеет ответ здесь:

У меня есть форма Android, которая должна обновлять себя на основе определенных выборов. Форма в настоящее время состоит из 2 спинин (A и B). Spinner B не создан до выбора Spinner A. После того, как выбор сделан B, будет отображаться на просмотр, и это содержимое динамически заполнено на основе выбора A. Вот мой код:

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));
    }

    ...
}

Этот код работает правильно. Когда либо «активировать» или «деактивировать» выбраны из списка, showListB() выполняет, что очень похоже на showListA() В том, как он создает новый ряд, который содержит метку и спиннер.

Проблема в том, что по умолчанию «Activate» отображается в Spinner, который выполняет showListB() И сразу у BAT, вторая часть формы создается на основе опции «Activate». Единственный обходной путь, с которым я могу придумать, это добавить третье поле на спиннер, так как:

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

...

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

Это работает ... но я не хочу третий вариант в списке. Я просто хочу, чтобы, по умолчанию, будьте пустыми или показывать какой-то текст «Подсказка», который не является опцией в списке после нажатия нажатия. Это возможно?

Спасибо

РЕДАКТИРОВАТЬ:

Содержание XML:

<Spinner
    android:id="@+id/spinnerAction"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>  
Это было полезно?

Решение

Мои данные-размеры .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>

В 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" /> 

В Java Code:

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
    }
}

Итак, хотя я могу видеть 2 как мой первый элемент по умолчанию, ничего не происходит, если пользователь на самом деле не выбирает его.

Надеюсь это поможет!

Другие советы

Если вы хотите, есть Decorater SpinnerAdapter Witch автоматически добавьте значение по умолчанию:



    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);
        }
    }


Тогда вы можете создать свой собственный спиннер, используя этот декор:



    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();
        }
    }


Вам просто нужно менять декларацию спиннер в вашем макете XML:



com.myproject.SpinnerWithNoValue


Если вы хотите, вы можете изменить код, чтобы установить текст по умолчанию в тег вашего Spinner.

Спиннер всегда будет выбирать. Что вы можете сделать, это сделать спиннер отображать что-то вроде «Выбрать» или «Выбрать опцию» ...

Для этого вы можете сделать ваши варианты списка

actionList = {"Select", "Desactivate" }

и

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

Или вы можете сделать что-то более сложное, как переопределяет вид спиннера или поместить кнопку вместо этого на него ничего, и когда он нажал, вы создаете свой Spinner.

Попробуйте установить это в XML с помощью приглашенного атрибута:

android:prompt="@string/prompt"

Это также заполнит верхнюю часть диалогового окна Spinner.

Я пропустил это в документацию. Подсказка не может быть применена напрямую. Приглашенный атрибут должен быть указан из другого источника. Попробуйте ссылку на строковое значение.

Документация от 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.

Я просто Pregginner в разработке приложений Android, и столкнулся с аналогичной проблемой; смог разобраться с помощью простого решения - это работало для меня, надеюсь, что это делает для вас также:

Вдобавление общедоступных классов расширяет активность навесных орудий ONITEMSELUCTERLISTENER {

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

// изменилось на SumTng else

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top