AppCompatSpinner的条目在第二次选择时未打开TimePickerDialog。请查看详细信息

发布于 2021-01-29 20:40:27

我将以下内容作为AppCompatSpinner条目:

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

选择后Pick a time..,将TimePickerDialog打开a并允许用户选择时间。这是如何做:

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并选择时间。

关注者
0
被浏览
75
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    跟着这些步骤:

    创建一个自定义微调器类

        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>
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看