Android数字选择器卡住了

3

我有一个数字选择器对话框,可以选择小时和分钟(每15分钟为间隔)。在大屏幕上运行良好,但在小屏幕和旧设备上,如果我尝试使用触摸滚动,它会卡住。

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设置为false?我在考虑是否可以始终显示向上和向下箭头,然后禁用滚动。
3个回答

0

将其更改为数字类型的Edittext,并在客户输入超出您范围的数字时使用Toast。这样视觉上更加优雅,而且不会给您带来任何问题。


0
你可以使用很棒的PickView库
参见PickView 这是一个辅助库,用于选择日期或省份,就像iOS系统的WheelView小部件一样。

2
你在那里自我宣传,是吧? - Vucko
1
不,我不是这个库的所有者,我只是使用它,并且它运行得很完美。 - Mostafa Anter
正如@Vucko所建议的那样,您应该在库中表明自己是所有者,并提供一个很好的例子来说明这可以帮助:http://meta.stackoverflow.com/questions/298734/is-it-acceptable-to-promote-my-own-library-as-part-of-a-real-answer - antonio
@antonio 他明确表示他不是那个库的所有者。 - Paul Stelian

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将减少与选择器大小相关的问题。希望这有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接