2016-06-21 3 views
2

У меня есть диалог номерчика, чтобы выбрать часы и минуты (интервал 15 минут). Он отлично работает на больших экранах, но на маленьких экранах и более старых устройствах он застревает, если я пытаюсь прокручивать с помощью касания.Android numberpicker get stuck

enter image description here

Я расширение android.widget.NumberPicker и уменьшение размера шрифта, который помогает на некоторых устройствах.

public class TimerNumberPicker extends android.widget.NumberPicker { 

    public TimerNumberPicker(Context context) { 
     super(context); 
    } 

    public TimerNumberPicker(Context context, AttributeSet attrs){ 
     super(context,attrs); 
    } 

    @Override 
    public void addView(View child) { 
     super.addView(child); 
     updateView(child); 
    } 

    @Override 
    public void addView(View child, ViewGroup.LayoutParams params) { 
     super.addView(child, params); 
     updateView(child); 
    } 

    @Override 
    public void addView(View child, int index, ViewGroup.LayoutParams params) { 
     super.addView(child, index, params); 
     updateView(child); 
    } 

    private void updateView(View view) { 
     if(view instanceof EditText){ 
      ((EditText) view).setTextSize(TypedValue.COMPLEX_UNIT_SP,16); 
      view.setTag(FontUtil.TAG_CONDENSED_LIGHT); 
      FontUtil.getInstence(getContext()).setFontByTag(view); 
     } 
    } 
} 

Что делает его более сложным является то, что минут только значения (0, 15, 30, 45) и я должен setWrapSelectorWheel to false?

Я думаю, что можно будет всегда показывать стрелки вверх и вниз, а затем отключать прокрутку.

ответ

0

Измените его на Edittext с типом номера и используйте Toast, если клиент поместил номер вверху или внизу вашего диапазона. Это более элегантное визуально, и это не даст вам никаких проблем на всех

0

вы можете использовать Фантастическую PickView библиотеку

См PickView

Это вспомогательный Lib для нас, чтобы выбрать дату или провинцию, как IOS - виджет WheelView.

+2

Реклама себя там, не так ли? – Vucko

+1

нет, я не являюсь владельцем библиотеки, я просто использую ее, и она отлично работает –

+0

Как подсказывает @Vucko, вы должны указать, что вы являетесь владельцем библиотеки и являетесь хорошим примером того, как это может помочь: http: // meta.stackoverflow.com/questions/298734/is-it-acceptable-to-promote-my-own-library-as-part-of-a-real-answer – antonio

0

Возможно, вы сможете решить это с помощью TimePicker.

Это может быть расположение:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="wrap_content" 
android:padding="8dp" 
android:layout_height="wrap_content"> 
<ScrollView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"> 
    <LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     > 
<TimePicker 
    android:id="@+id/time_picker" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    /> 

<Button 
    android:id="@+id/date_time_set" 
    android:layout_width="match_parent" 
    android:text="Set" 
    android:layout_height="wrap_content" /> 
    </LinearLayout> 
</ScrollView> 

В то время как диалог может быть включен в нормальный боевой готовности:

private void showTimePicker(){ 
    final View dialogView = View.inflate(getActivity(), <time_picker_container_layout_id>, null); 
    final AlertDialog alertDialog = new AlertDialog.Builder(getActivity()).create(); 

    dialogView.findViewById(R.id.date_time_set).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 

      TimePicker timePicker = (TimePicker) dialogView.findViewById(R.id.time_picker); 

      String time = timePicker.getCurrentHour()+":"+timePicker.getCurrentMinute()); 

      dateTime.setText(time); 
      alertDialog.dismiss(); 
     }}); 


    TimePicker timePicker = (TimePicker) dialogView.findViewById(R.id.time_picker); 

    timePicker.setCurrentHour(<default_hour>); 
    timePicker.setCurrentMinute(<default_minute>); 

    alertDialog.setView(dialogView); 
    alertDialog.show(); 
} 

Если вам нужно, чтобы показать только 15' , вы может округлить выбранные минуты до ближайшего действительного значения.

ScrollView в макете уменьшит проблемы, связанные с размером подборщика. Надеюсь, это помогло.