2015-11-21 2 views
0

У меня есть два прядильника во фрагменте, один из счетчиков отобразит тост-сообщение, когда выбран элемент. Проблема заключается в том, что тост в первом операторе if-else отображается дважды. Как только откроется фрагмент и второй раз, когда элемент выбран.Тост отображается дважды

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    mRootView = inflater.inflate(R.layout.add, container, false); 



    //------------------------------unit Spinner adapter---------------------------------------// 
    Spinner spinner = (Spinner) mRootView.findViewById(R.id.units); 

    //Create ArrayAdapter using string array and default spinner 
    ArrayAdapter<CharSequence> sAdapter = ArrayAdapter.createFromResource(getActivity(), R.array.units, android.R.layout.simple_spinner_dropdown_item); 

    //Specify layout to use when list of choices appears 
    sAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

    //Apply adapter to the spinner 
    spinner.setAdapter(sAdapter); 


    //----------------------------reminder Spinner adapter-------------------------------------// 
    Spinner reminderSpinner = (Spinner) mRootView.findViewById(R.id.list_reminder); 
    ArrayAdapter<CharSequence> reminderAdapter = ArrayAdapter.createFromResource(getActivity(), R.array.countdown_reminder, android.R.layout.simple_spinner_dropdown_item); 
    reminderAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    reminderSpinner.setAdapter(reminderAdapter); 



    spinner.setOnItemSelectedListener(spinnerListener); 
    reminderSpinner.setOnItemSelectedListener(spinnerListener); 

return mRootView; 
} 


    //---------------------------------Spinner Listener----------------------------------------// 
    AdapterView.OnItemSelectedListener spinnerListener = new AdapterView.OnItemSelectedListener() { 

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

      switch (parent.getId()) { 

       case R.id.units: 
        String selectedUnit = parent.getItemAtPosition(position).toString(); 
        break; 
       case R.id.list_reminder: 
        String reminder = parent.getItemAtPosition(position).toString(); 


        if (reminder.equals("24 hours")) { 
         Toast.makeText(getActivity(), "Reminder has been set 24 hours from the selected date", Toast.LENGTH_LONG).show(); 

        } else if (reminder.equals("2 days")) { 
         Toast.makeText(getActivity(), "Reminder has been set 2 days from the selected date", Toast.LENGTH_LONG).show(); 

        } else if (reminder.equals("3 days")) { 
         Toast.makeText(getActivity(), "Reminder has been set 3 days from the selected date", Toast.LENGTH_LONG).show(); 

        } else if (reminder.equals("1 week")) { 
         Toast.makeText(getActivity(), "Reminder has been set 1 week from the selected date", Toast.LENGTH_LONG).show(); 

        } else if (reminder.equals("2 weeks")) { 
         Toast.makeText(getActivity(), "Reminder has been set 2 weeks from the selected date", Toast.LENGTH_LONG).show(); 

        } else if (reminder.equals("1 month")) { 
         Toast.makeText(getActivity(), "Reminder has been set 1 month from the selected date", Toast.LENGTH_LONG).show(); 
        } 
        break; 
      } 
     } 


     public void onNothingSelected(AdapterView<?> parent) { 
     } 
    }; 
    //------------------------------------end spinner code-------------------------------------// 

Тост «24 часа» отображается, когда пользователь открывает фрагмент и выбирает «24 часа». Я не могу понять, что не так с кодом. Помоги пожалуйста?!

+0

http://stackoverflow.com/questions/5624825/spinner-onitemselected-executes-when-it-is-not-suppose-to/5918177#5918177 –

+0

Спасибо за ссылку. Я попробовал решение по ссылке, и он работает! Спасибо. –

ответ

3

Ваш onItemSelectedListener может быть вызван, когда вы установите его в onCreateView, или его можно вызвать, когда он изначально отображает представление. Одна хакерская работа - просто иметь логическое значение, которое выполняет только код в вашем слушателе после того, как он был вызван хотя бы один раз раньше.

2

IIRC, счетчик должен иметь выбранный элемент, несмотря ни на что, поэтому он устанавливает первый элемент при его запуске и, таким образом, OnItemSelected запускается при запуске счетчика. Ни в коем случае, если вы не хотите взломать код счетчика.

Что вы можете сделать, это добавить переменную счетчика, чтобы определить, будет ли это первый раз, и не показывать тост, если он первый раз.

1

Это связано с тем, что ваш adpater's onItemSelected вызывается, когда вы устанавливаете адаптер на свой счетчик. Добавьте точку отладки в этот блок if. Решением было бы использовать логический флаг, чтобы проверить, выбрал ли пользователь счетчик или нет. Изначально сделайте это ложным. то перед вашим коммутатором проверьте, установлен ли этот флаг. Если это ложь, тогда не выполняйте функцию switch else. сделать логический флаг истинным после случая переключения. Следовательно, это будет ложно для первой загрузки, и тост не появится, когда будет загружен фрагмент.

Смежные вопросы