0

spinnerにはPick a time..という項目が1つしかありません。この商品をクリックするとTimePickerDialogが開きます。スピナーアイテムをクリックして自動的に開くのを待ってからTimePickerDialogを開くのを防ぐには?

ここに私のコードです:

AdapterView.OnItemSelectedListener endTimeListener = new AdapterView.OnItemSelectedListener() { 

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

       final TextView endTimeSpinnerTV = (TextView) adapterView.getChildAt(0); 

       switch (i) { 
        default: 
         final Calendar c = Calendar.getInstance(); 
         mHourEnd = c.get(Calendar.HOUR_OF_DAY); 
         mMinuteEnd = 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)); 

             showTimeEnd(hourOfDay, minute); 

             userAvailableTillTimeInSF = new SimpleDateFormat("HH:mm:ss").format(date.getTime()); 

             endTimeString = new SimpleDateFormat("hh:mm a").format(date.getTime()); 

             endTimeSpinnerTV.setText(userAvailableTillTimeAMPM); 

            } 
           }, mHourEnd, mMinuteEnd, false); 
         timePickerDialog.show(); 
         break; 
       } 
      } 

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

      } 
     }; 

SpinnerOnSameSelection endTimeSpinner.setOnItemSelectedEvenIfUnchangedListener(endTimeListener); 

はここSpinnerOnSameSelectionクラスです:

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

、ここでshowTimeEnd(int hour, int min)です:

public void showTimeEnd(int hour, int min) { 
     if (hour == 0) { 
      hour += 12; 
      format = "AM"; 
     } else if (hour == 12) { 
      format = "PM"; 
     } else if (hour > 12) { 
      hour -= 12; 
      format = "PM"; 
     } else { 
      format = "AM"; 
     } 

     userAvailableTillTimeAMPM = hour + ":" + min + " " + format; 

} 

私は活動を開くと、問題はそのあり、 TimePickerDialogが自動的に開きます。

どうすればいいですか?これを防ぐにはどうすればよいですか?

+1

私はあなたはスピナーの価値を設定していると思います。そうであれば、項目の選択が変更され、リスナーが起動します。私もその問題を抱えていました。スピンナーの代わりに 'TextView'を使って解決しました。ユーザーがTextView –

+0

をクリックしたときにpickerDialogを表示すると、問題が解決するかどうかがわかります。それから私はそれを答えに変えます –

+0

@EduardoHerzer私は 'スピナー'を使わなければなりません。ここで 'TextView'を使うことはできません。 –

答えて

1

値の前にリスナーを設定していると思います。聞き手は解雇されます:

endTimeSpinner.setOnItemSelectedEvenIfUnchangedListener(endTimeListener); 
endTimeSpinner.setSelection(1); 

あなたはそれを反転する必要があります。最初の選択を設定し、リスナーを設定

endTimeSpinner.setSelection(1); 
endTimeSpinner.setOnItemSelectedEvenIfUnchangedListener(endTimeListener); 

編集:

私はあなたがclickListenerでTextViewを使用している場合、それはより良い仕事とかなり確信しています。

しかし、あなたが本当にスピナーが必要な場合は、位置が0であれば、あなたのリスナーを呼び出していないしてみてください。

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 && position > 0) { 
       listener.onItemSelected(parent, view, position, id); 
      } 
     } 

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

} 
+0

何が 'endTimeSpinner.setSelection(1);'ですか?私はそのようなコード行を持っていません。 –

+0

@HammadNasirどのようにスピナーの値を設定していますか? –

+0

あなたは値をスピナーにどのように割り当てるのですか?これは文字列ファイルで次のように宣言されています: ' 時間を選択して 'を選択し、xmlファイルに 'android:entries = @ array/pEndTimeList "' –

0

それを解決する方法は、このようなあなたのリスナーを設定することです:

endTimeSpinner.post(new Runnable() { 
     @Override 
     public void run() { 
      endTimeSpinner.setOnItemSelectedListener(endTimeListener); 
     } 
    }) 
関連する問題