2016-06-21 15 views
2

Ich habe einen numberpicker Dialog, um Stunden und Minuten (15 Minuten Intervall) auszuwählen. Es funktioniert gut auf großen Bildschirmen, aber auf kleinen Bildschirmen und älteren Geräten bleibt es stecken, wenn ich versuche, mit Touch zu scrollen.Android numberpicker stecken bleiben

enter image description here

ich den android.widget.NumberPicker bin erstreckt und die Verringerung der Schriftgröße, die auf einigen Geräten hilft.

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

Was macht es komplizierter ist, dass die Minuten haben nur Werte (0, 15, 30, 45) und ich muss setWrapSelectorWheel to false?

Ich denke, wenn es möglich sein wird, immer die Pfeile nach oben und unten zu zeigen und Scroll deaktivieren dann.

Antwort

0

Ändern Sie es in einen Edittext mit dem Typ der Nummer, und verwenden Sie einen Toast, wenn der Client eine Zahl ober- oder unterhalb Ihres Bereichs setzt. Es ist optisch elegant, und das wird Ihnen keine Probleme geben bei allen

0

können Sie fantastische PickView Bibliothek

Siehe PickView

Dies ist ein Helfer lib verwenden für uns Datum oder Provinz zu holen wie IOS-System WheelView-Widget.

+2

Werben Sie sich dort, nicht wahr? – Vucko

+1

nein ich bin nicht der Besitzer der Bibliothek Ich benutze es einfach und es funktioniert perfekt –

+0

Wie @Vucko schlägt vor, sollten Sie angeben, dass Sie der Besitzer der Bibliothek sind und ein gutes Beispiel dafür, wie dies helfen kann: http: // meta.stackoverflow.com/questions/298734/is-it-acceptable-to-promote-my-own-library-as-part-of-a-real-answer – antonio

0

Vielleicht können Sie es mit einem TimePicker lösen.

Dies ist das Layout sein könnte:

<?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> 

Während der Dialog in einem normalen Alarm aufgenommen werden könnten:

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

Wenn Sie zeigen, müssen nur die 15'

, Sie kann die ausgewählten Minuten auf den nächsten gültigen Wert runden.

Die scrollView im Layout reduziert Probleme im Zusammenhang mit der Picker-Größe. Ich hoffe es hat geholfen.

Verwandte Themen