【问题标题】:Toast displayed twiceToast 显示两次
【发布时间】:2015-11-21 23:35:22
【问题描述】:

I have two spinners in a fragment, one of the spinner will display toast message when an item is selected.问题是第一个 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 小时”吐司。我无法弄清楚代码有什么问题。请帮忙?!

【问题讨论】:

标签: android if-statement spinner toast


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    IIRC,无论如何,微调器必须有一个选定的项目,因此它在启动时设置第一个项目,因此在微调器启动时会触发OnItemSelected。除非您想破解微调器代码,否则无法绕过它。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-12-06
        • 1970-01-01
        • 2021-12-24
        • 2015-06-15
        • 1970-01-01
        • 1970-01-01
        • 2022-10-15
        相关资源
        最近更新 更多