【问题标题】:AppCompatSpinner's entries not opening TimePickerDialog on selecting it second time. Please see detailsAppCompatSpinner 的条目在第二次选择时未打开 TimePickerDialog。请查看详情
【发布时间】:2016-11-22 17:45:42
【问题描述】:

我有以下AppCompatSpinner 的条目:

<string-array name="startTimeList">
    <item>Now</item>
    <item>Pick a time..</item>
</string-array>

选择Pick a time..后,会打开TimePickerDialog,允许用户选择时间。方法如下:

startTimeSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
//                startTimeString = adapterView.getItemAtPosition(i).toString();
                DateFormat currentDateFormat = new SimpleDateFormat("HH:mm:ss");
                userAvailableTimeInSF = currentDateFormat.format(new Date());

                final TextView startTimeSpinnerTV = (TextView) adapterView.getSelectedView();
                startTimeSpinnerTV.setText(userAvailableTimeInSF);

                switch (i) {
                    case 0:

                        userAvailableTimeInSF = currentDateFormat.format(new Date());
                        startTimeSpinnerTV.setText("Now");
                        break;

                    default:

                        final Calendar c = Calendar.getInstance();
                        mHour = c.get(Calendar.HOUR_OF_DAY);
                        mMinute = c.get(Calendar.MINUTE);

                        TimePickerDialog timePickerDialog = new TimePickerDialog(PostSportRequest.this,
                                new TimePickerDialog.OnTimeSetListener() {

                                    @Override
                                    public void onTimeSet(TimePicker view, int hourOfDay,
                                                          int minute) {

                                        Calendar date = Calendar.getInstance();
                                        date.set(Calendar.HOUR_OF_DAY, hourOfDay);
                                        date.set(Calendar.MINUTE, minute);
                                        date.set(Calendar.AM_PM, date.get(Calendar.AM_PM));

                                        showTime(hourOfDay, minute);

                                        userAvailableTimeInSF = new SimpleDateFormat("HH:mm:ss").format(date.getTime());
                                        startTimeSpinnerTV.setText(userAvailableTimeAMPM);

                                        Toast.makeText(getBaseContext(), "userAvailableTimeInSF: " + userAvailableTimeInSF, Toast.LENGTH_SHORT).show();

                                    }
                                }, mHour, mMinute, false);
                        timePickerDialog.show();
                        break;
                }

            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {

            }
        });

第一次选择Pick a time..时,TimePickerDialog成功打开并显示选择的时间,但是当我再次选择它或再次点击它时,没有任何反应!

我不知道为什么!

请告诉我如何打开 TimePickerDialog 并选择时间,无论我选择/单击多少次。

【问题讨论】:

  • @SuryaPrakashKushawah 兄弟,我已经尽可能清楚地解释了这个问题。看到这一行:“在选择 Pick a time.. 第一次时,TimePickerDialog 成功打开并显示选择的时间,但是当我再次选择它或再次单击它时,什么也没有发生!”
  • i 是什么?您是否在第二次选择时收到 Toast 消息?
  • @ρяσѕρєяK int ionItemSelected() 中的一个参数,是的,我第一次收到Toast 消息,但是如果没有先选择case 0,我再次选择case 1,什么也没有发生!正如@MarcinJedynak 在下面的答案中所述,他的方法对我不起作用!
  • @HammadNasir:好的,然后将 case 1: 更改为 default: 并检查每次获取对话框,不包括 0
  • @ρяσѕρєяK 它没有帮助!请查看已编辑的问题,并查看下面 Marcin 的答案。他有充分的理由说明为什么会发生这种情况。

标签: java android android-spinner timepicker


【解决方案1】:

按照以下步骤操作:

创建自定义微调器类

    import android.content.Context;
    import android.util.AttributeSet;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.Spinner;

    public class SpinnerOnSameSelection extends Spinner {
        OnItemSelectedListener listener;
        private AdapterView<?> lastParent;
        private View lastView;
        private long lastId;

        public SpinnerOnSameSelection(Context context, AttributeSet attrs) {
            super(context, attrs);
            // TODO Auto-generated constructor stub
            initlistner();
        }

        @Override
        public void setSelection(int position) {
            if (position == getSelectedItemPosition() && listener != null) {
                listener.onItemSelected(lastParent, lastView, position, lastId);
            } else {
                super.setSelection(position);
            }

        }

        private void initlistner() {
            // TODO Auto-generated method stub
            super.setOnItemSelectedListener(new OnItemSelectedListener() {

                @Override
                public void onItemSelected(AdapterView<?> parent, View view,
                                           int position, long id) {
                    // TODO Auto-generated method stub
                    lastParent = parent;
                    lastView = view;
                    lastId = id;
                    if (listener != null) {
                        listener.onItemSelected(parent, view, position, id);
                    }
                }

                @Override
                public void onNothingSelected(AdapterView<?> parent) {
                    // TODO Auto-generated method stub
                    if (listener != null) {
                        listener.onNothingSelected(parent);
                    }
                }
            });

        }

        public void setOnItemSelectedEvenIfUnchangedListener(
                OnItemSelectedListener listener) {
            this.listener = listener;
        }

}

在您的活动中创建onItemSelectedListener

private AdapterView.OnItemSelectedListener listener;

 listener = new AdapterView.OnItemSelectedListener() {

            @Override
            public void onItemSelected(AdapterView<?> adapterView, View arg1,
                                       int i, long arg3) {

                //startTimeString = adapterView.getItemAtPosition(i).toString();
                DateFormat currentDateFormat = new SimpleDateFormat("HH:mm:ss");
                userAvailableTimeInSF = currentDateFormat.format(new Date());

                final TextView startTimeSpinnerTV = (TextView) adapterView.getSelectedView();
                startTimeSpinnerTV.setText(userAvailableTimeInSF);

                switch (i) {
                    case 0:

                        // userAvailableTimeInSF = currentDateFormat.format(new Date());
                        startTimeSpinnerTV.setText("Now");
                        break;

                    case 1:

                        final Calendar c = Calendar.getInstance();
                        mHour = c.get(Calendar.HOUR_OF_DAY);
                        mMinute = c.get(Calendar.MINUTE);

                        TimePickerDialog timePickerDialog = new TimePickerDialog(MainActivity.this,
                                new TimePickerDialog.OnTimeSetListener() {

                                    @Override
                                    public void onTimeSet(TimePicker view, int hourOfDay,
                                                          int minute) {

                                        Calendar date = Calendar.getInstance();
                                        date.set(Calendar.HOUR_OF_DAY, hourOfDay);
                                        date.set(Calendar.MINUTE, minute);
                                        date.set(Calendar.AM_PM, date.get(Calendar.AM_PM));

                                        //showTime(hourOfDay, minute);

                                       /* userAvailableTimeInSF = new SimpleDateFormat("HH:mm:ss").format(date.getTime());
                                        startTimeSpinnerTV.setText(userAvailableTimeAMPM);*/

                                        Toast.makeText(getBaseContext(), "userAvailableTimeInSF: " + userAvailableTimeInSF, Toast.LENGTH_SHORT).show();

                                    }
                                }, mHour, mMinute, false);
                        timePickerDialog.show();
                        break;
                }
            }

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

            }
        };
}

将监听器对象添加到自定义微调器方法

SpinnerOnSameSelection startTimeSpinner;

in onCreate(): startTimeSpinner = (SpinnerOnSameSelection) findViewById(R.id.idOfItemInXml);

startTimeSpinner.setOnItemSelectedEvenIfUnchangedListener(listener);

在您的 xml 文件中

<your_package_name.SpinnerOnSameSelection
    android:id="@+id/startTimeSpinner"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:layout_alignParentBottom="true"
    android:entries="@array/mList">
</your_package_name.SpinnerOnSameSelection>

【讨论】:

  • 不...请试试这个..这符合您的要求。
  • SpinnerOnSameSelection 是内部类还是单独的文件?
  • 它的独立类。
  • 那么我应该如何在这里访问它:startTimeSpinner.setOnItemSelectedEvenIfUnchangedListener(listener); 在另一个类中?我在这一行收到Cannot resolve method 错误。
【解决方案2】:

Spinner(或实际上是 AdapterView,它的超类)仅在选择更改时触发 OnItemSelectedListener。

当您的用户选择“Pick a time...”时,Spinner 假定它是一个已选择的选项,如果再次选择它就不会再调用侦听器了。但是您可以注意到,如果选择“Pick a time...”,然后选择“Now”,然后选择“Pick a time...”,则会出现对话框。

我建议不要在您的情况下使用 Spinner(并使用所选视图做一些奇怪的事情)。您可以简单地使用显示所选时间和两个按钮的 TextView 完成相同的操作 - 一个用于显示对话框,一个用于将时间重置为现在。

【讨论】:

  • 我需要使用Spinner。请让我知道如何仅使用它来实现它。
  • 可能会在您选择的时间添加一个附加选项。当用户选择时间时,只需更改附加选项的文本并以编程方式选择它 (setSelection(int))。这样,“Pick a time...”将始终被视为新选择的。
  • 用户可以随时选择,我可以添加多少其他选项?可能有很多可能性!
猜你喜欢
  • 1970-01-01
  • 2014-10-26
  • 1970-01-01
  • 1970-01-01
  • 2017-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-11
相关资源
最近更新 更多