2016-11-22 17 views
8

Tôi đã sau như mục AppCompatSpinner 's:Mục nhập của AppCompatSpinner không mở TimePickerDialog khi chọn lần thứ hai. Xin vui lòng xem chi tiết

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

Khi chọn Pick a time.., một TimePickerDialog được mở ra và người dùng được phép chọn một thời điểm. Đây là cách:

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) { 

      } 
     }); 

Khi chọn Pick a time.. lần đầu tiên, TimePickerDialog được mở ra thành công và thời gian lựa chọn được hiển thị nhưng khi tôi chọn nó một lần nữa hoặc bấm vào nó một lần nữa, không có gì xảy ra!

Tôi không biết tại sao!

Vui lòng cho tôi biết cách tôi có thể mở TimePickerDialog và chọn thời gian bất kể tôi đã chọn/nhấp vào thời gian bao nhiêu lần.

+0

Bạn có thể chia sẻ thêm thông tin chi tiết. Điều gì thực sự xảy ra. ?? –

+0

@SuryaPrakashKushawah bro, tôi đã giải thích rõ ràng nhất có thể trong câu hỏi. Xem dòng này: "Khi chọn Chọn thời gian .. lần đầu tiên, TimePickerDialog được mở thành công và thời gian đã chọn được hiển thị nhưng khi tôi chọn lại lần nữa hoặc nhấp lại vào nó, không có gì xảy ra!" –

+0

'i' là gì? và bạn có nhận được thông báo về bánh mì nướng vào lựa chọn thứ hai không? –

Trả lời

6

Thực hiện theo các bước sau:

Tạo một lớp tùy chỉnh spinner

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; 
     } 

} 

Tạo onItemSelectedListener trong hoạt động của bạn

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 

      } 
     }; 
} 

Thêm đối tượng người nghe đến phương pháp spinner tùy chỉnh

SpinnerOnSameSelection startTimeSpinner; 

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

startTimeSpinner.setOnItemSelectedEvenIfUnchangedListener(listener); 

Trong xml tập tin của bạn

<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

bạn không cần phải chỉnh sửa điều này? –

+0

Không ... pl thử này..Điều này đáp ứng yêu cầu của bạn. –

+0

@HammadNasir Hãy cho tôi biết quan điểm của bạn ..... –

3

Spinner (hoặc thực sự là AdapterView, siêu lớp của nó), chỉ kích hoạt OnItemSelectedListener khi lựa chọn thay đổi.

Khi người dùng của bạn chọn "Chọn thời gian ..." Spinner giả định đó là tùy chọn đã chọn và sẽ không gọi cho người nghe nữa nếu được chọn lại. Tuy nhiên, bạn có thể nhận thấy rằng nếu "Chọn một thời gian ..." được chọn, sau đó "Hiện hành" và sau đó "Chọn một thời gian ...", hộp thoại sẽ xuất hiện.

Tôi khuyên bạn nên chống lại việc sử dụng Spinner trong trường hợp của bạn (và thực hiện một số shit lạ với chế độ xem đã chọn). Bạn chỉ có thể thực hiện tương tự với TextView hiển thị thời gian và hai nút đã chọn - một để hiển thị hộp thoại và một nút để đặt lại thời gian cho đến bây giờ.

+0

Tôi cần sử dụng 'Spinner'. Xin vui lòng cho tôi biết làm thế nào để đạt được nó bằng cách sử dụng nó chỉ. –

+1

Có thể thêm tùy chọn bổ sung với thời gian bạn đã chọn. Khi người dùng chọn thời gian, chỉ cần thay đổi văn bản của tùy chọn bổ sung của bạn và chọn theo chương trình nó ('setSelection (int)'). Bằng cách đó, "Chọn một thời gian ..." sẽ luôn được coi là mới được chọn. –

+0

Người dùng có thể chọn bất kỳ lúc nào anh ấy muốn, tôi có thể thêm bao nhiêu tùy chọn khác? Có thể có rất nhiều khả năng! –

Các vấn đề liên quan