2016-11-22 7 views
8

У меня есть следующие в качестве записей AppCompatSpinner «s:Записи AppCompatSpinner не открываются TimePickerDialog при выборе его во второй раз. Пожалуйста, смотрите подробности

<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 и выбрать время независимо от того, сколько раз я его выбираю/нажимаю.

+0

Можете ли вы предоставить более подробную информацию. Что на самом деле происходит? –

+0

@SuryaPrakashKushawah bro, я объяснил так ясно, как могу в вопросе. См. Эту строку: «После выбора« Выберите время »... в первый раз, TimePickerDialog успешно открывается и отображается выбранное время, но когда я его снова выберу или нажму на него, ничего не произойдет!» –

+0

Что такое 'i'? и вы получаете сообщение Toast во второй выбор? –

ответ

6

Выполните следующие действия:

Создать пользовательский класс спиннера

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> 
+0

Вам не нужно это редактировать? –

+0

Нет ... попробуйте это. Это соответствует вашему требованию. –

+0

@HammadNasir Дайте мне знать ваши взгляды ..... –

3

Spinner (или фактически AdapterView, его суперкласс), запускает OnItemSelectedListener только при изменении выбора.

Когда пользователь выбирает «Выбрать время ...», Spinner предполагает, что это выбранная опция, и больше не будет вызывать слушателя, если он будет выбран снова. Однако вы можете заметить, что если выбрано «Pick a time ...», затем «Now», а затем «Pick a time ...», появится диалоговое окно.

Я бы рекомендовал не использовать Spinner в вашем случае (и делать какое-то странное дерьмо с выбранным видом). Вы можете просто выполнить то же самое с TextView, который отображает выбранное время и две кнопки - один для отображения диалогового окна и один для сброса времени до настоящего времени.

+0

Мне нужно использовать 'Spinner'. Пожалуйста, дайте мне знать, как достичь этого, используя его только. –

+1

Возможно, добавьте дополнительную опцию с выбранным временем. Когда пользователь выбирает время, просто измените текст своего дополнительного параметра и программно выберите его ('setSelection (int)'). Таким образом, «выбрать время ...» всегда будет рассматриваться как вновь выбранный. –

+0

Пользователь может выбрать любое время, сколько захочет, сколько еще вариантов можно добавить? Там может быть много возможностей! –

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

  • Нет связанных вопросов^_^