2015-11-21 190 views
0

我在一个片段中有两个旋钮,其中一个旋钮会在选择某个项目时显示Toast消息。问题是第一个if-else语句中的敬酒显示两次。一旦打开片段,第二次选择该项目时。Toast显示两次

@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

当您在onCreateView中设置它时,您的onItemSelectedListener可能会被调用,或者它在最初显示视图时可能会被调用。一个怪异的解决方法是只有一个布尔值,它至少在调用过一次之后才执行监听器中的代码。

2

IIRC,无论如何,微调控制器都必须有选定的项目,所以它在启动时设置第一个项目,因此在微调器启动时会触发OnItemSelected。没有办法解决它,除非你想破解微调代码。

你可以做的是添加一个计数器变量,以确定它是否是第一次通过,如果是第一次不显示吐司。

1

这是因为在将适配器设置为微调器时,将会调用您的adpater的onItemSelected。在if块中添加一个调试点。解决方案是使用布尔标志来检查用户是否选择了微调器。最初使其为假。那么在切换之前检查该标志是否为假。如果它是假的,那么不要执行切换,否则做。在切换大小写后使布尔标志为真。因此,对于第一次加载它将是错误的,并且在加载片段时不会出现烤面包。