2016-08-03 16 views
1

私はAndroidから継承したカスタムTimePickerDialogを持っています。このダイアログは、OnTimeSetListenerというインタフェースを持ち、そのコンテキストまたは親のフラグメントによって実装されなければなりません。サブクラスがオーバーライドされた親のインタフェースメソッドを呼び出さない

CustomTimePickerDialog.java

public class CustomTimePickerDialog extends DialogFragment implements 
     android.app.TimePickerDialog.OnTimeSetListener { 

    ... 

    private OnTimeSetListener listener; 

    public static TimePickerDialog newInstance(int hour, int minutes) { 
     TimePickerDialog fragment = new TimePickerDialog(); 

     return fragment; 
    } 

    @NonNull 
    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     return new android.app.TimePickerDialog(getContext(), this, 0, 0, true); 
    } 

    @Override 
    public void onTimeSet(TimePicker timePicker, int hour, int minutes) { 
     listener.onTimeSet(hour, minutes); 
    } 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 

     Object parent = getParentFragment() == null 
       ? context 
       : getParentFragment(); 

     if (parent instanceof OnTimeSetListener) { 
      listener = ((OnTimeSetListener) parent); 
     } else { 
      throw new RuntimeException(parent + " must implement OnTimeSetListener"); 
     } 
    } 

    public interface OnTimeSetListener { 
     void onTimeSet(int hour, int minutes); 
    } 
} 

問題はこのように、私はonTimeSet()動作を変更するには、再度、このクラスを拡張する必要があるということです。

LimitedCustomTimePickerDialog.java

public class LimitedCustomTimePickerDialog extends CustomTimePickerDialog { 

    @Override 
    public void onTimeSet(TimePicker timePicker, int hour, int minutes) { 
     int standardMinutes = minutes < 30 ? 0 : 30; 
     super.onTimeSet(timePicker, hour, standardMinutes); 
    } 

} 

しかし、決してcalleではありませんd!どうすればこれを達成できますか?

答えて

0

あなたはonTimeSetを呼び出す誰かのインターフェイスを実装しましたか?このメソッドを使用する場所を実装するだけです。

+0

スーパークラスのみがそれを実装しています。サブクラスは、そのメソッドをオーバーライドしています。 onTimeSetはネイティブのAndroid TimePickerDialogによって呼び出されています。これは、ユーザーがダイアログの「OK」ボタンをクリックしたときに発生します。 – josemigallas

関連する問題