android - TimePicker 在 4 版 android 上工作正常,但在 2.3 版中出现崩溃错误。 (安卓)

标签 android date picker

我有一个显示“TimePicker”的代码。它允许您在从 1.15 到 11.30 之间选择一个小时时设置最小值和最大值,还允许您将间隔设置为 15 分钟。在几分钟内。代码在 Android 版本 4 上运行良好,当 TimePicker 在滚动上运行时,以及在 android 2.3 TimePicker 版本上当您按下这些按钮之一以执行 Exeption 时显示加号和减号按钮时。告诉我在新旧版本的android上运行的代码要做什么?

代码如下:

类 1.MainActivity

import android.app.Activity;
import android.app.Dialog;
import android.app.TimePickerDialog.OnTimeSetListener;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.TimePicker;

public class PickerTimeDialogProsto extends Activity {

  int DIALOG_TIME = 1;
  int myHour = 1;
  int myMinute = 15;
  TextView tvTime;

    /** Called when the activity is first created. */
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_picker_time_dialog_prosto);
        tvTime = (TextView) findViewById(R.id.tvTime);
    }

    public void onclick(View view) {
      showDialog(DIALOG_TIME);
                }

    protected Dialog onCreateDialog(int id) {
      if (id == DIALOG_TIME) {

        RangeTimePickerDialog tpd = new RangeTimePickerDialog(this, myCallBack, myHour, myMinute, true);

        tpd.setMin(1, 15);
        tpd.setMax(11, 30);

        return tpd;
      }
      return super.onCreateDialog(id);
    }

    OnTimeSetListener myCallBack = new OnTimeSetListener() {
    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
      myHour = hourOfDay;
      myMinute = minute; 
      tvTime.setText("Time is " + myHour + " hours " + myMinute + " minutes");
    }
  };
}

第 2 类

import java.lang.reflect.Field;
import java.text.DateFormat;
import java.util.Calendar;

import android.app.TimePickerDialog;
import android.content.Context;
import android.widget.TimePicker;

/**
 * A time dialog that allows setting a min and max time.
 * 
 */
public class RangeTimePickerDialog extends TimePickerDialog {

    private int minHour = -1;
    private int minMinute = -1;

    private int maxHour = 25;
    private int maxMinute = 25;

    private int currentHour = 0;
    private int currentMinute = 0;

    private Calendar calendar = Calendar.getInstance();
    private DateFormat dateFormat;

    public RangeTimePickerDialog(Context context, OnTimeSetListener callBack,
            int hourOfDay, int minute, boolean is24HourView) {
        super(context, callBack, hourOfDay, minute, is24HourView);
        currentHour = hourOfDay;
        currentMinute = minute;
        dateFormat = DateFormat.getTimeInstance(DateFormat.SHORT);

        try {
            Class<?> superclass = getClass().getSuperclass();
            Field mTimePickerField = superclass.getDeclaredField("mTimePicker");
            mTimePickerField.setAccessible(true);
            TimePicker mTimePicker = (TimePicker) mTimePickerField.get(this);
            mTimePicker.setOnTimeChangedListener(this);
        } catch (NoSuchFieldException e) {
        } catch (IllegalArgumentException e) {
        } catch (IllegalAccessException e) {
        }
    }

    public void setMin(int hour, int minute) {
        minHour = hour;
        minMinute = minute;
    }

    public void setMax(int hour, int minute) {
        maxHour = hour;
        maxMinute = minute;
    }

    @Override
    public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {

        boolean validTime = true;
        if (hourOfDay < minHour || (hourOfDay == minHour && minute < minMinute)) {
            validTime = false;
        }

        if (hourOfDay > maxHour || (hourOfDay == maxHour && minute > maxMinute)) {
            validTime = false;
        }

        if (validTime) {
            currentHour = hourOfDay;
            currentMinute = minute;
        }

        updateTime(currentHour, currentMinute);
        updateDialogTitle(view, currentHour, currentMinute);
    }

    private void updateDialogTitle(TimePicker timePicker, int hourOfDay,
            int minute) {
        calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
        calendar.set(Calendar.MINUTE, minute);
        String title = dateFormat.format(calendar.getTime());
        setTitle(title);
    }
}

这就是 Log 的作用:

09-06 11:34:21.802: D/dalvikvm(1213): GC_EXTERNAL_ALLOC freed 104K, 48% free 2819K/5379K, external 2046K/2137K, paused 54ms
09-06 11:34:24.981: I/dalvikvm(1213): threadid=1: stack overflow on call to Landroid/text/SpannableStringBuilder;.getChars:VIILI
09-06 11:34:24.981: I/dalvikvm(1213):   method requires 36+20+20=76 bytes, fp is 0x4214a334 (52 left)
09-06 11:34:24.981: I/dalvikvm(1213):   expanding stack end (0x4214a300 to 0x4214a000)
09-06 11:34:24.991: I/dalvikvm(1213): Shrank stack (to 0x4214a300, curFrame is 0x4214cebc)
09-06 11:34:24.991: D/AndroidRuntime(1213): Shutting down VM
09-06 11:34:24.991: W/dalvikvm(1213): threadid=1: thread exiting with uncaught exception (group=0x40015560)
09-06 11:34:25.111: E/AndroidRuntime(1213): FATAL EXCEPTION: main
09-06 11:34:25.111: E/AndroidRuntime(1213): java.lang.StackOverflowError
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.text.TextUtils.getChars(TextUtils.java:69)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.text.method.ReplacementTransformationMethod$ReplacementCharSequence.getChars(ReplacementTransformationMethod.java:151)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.text.TextUtils.getChars(TextUtils.java:69)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.graphics.Paint.measureText(Paint.java:1068)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.text.Styled.drawUniformRun(Styled.java:146)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.text.Styled.drawDirectionalRun(Styled.java:298)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.text.Styled.measureText(Styled.java:430)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.text.Layout.measureText(Layout.java:1518)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.text.Layout.getHorizontal(Layout.java:564)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.text.Layout.getHorizontal(Layout.java:548)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.text.Layout.getPrimaryHorizontal(Layout.java:533)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.widget.TextView.getFocusedRect(TextView.java:4222)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.view.FocusFinder.findNextFocus(FocusFinder.java:72)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.view.ViewGroup.focusSearch(ViewGroup.java:476)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.view.ViewGroup.focusSearch(ViewGroup.java:478)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.view.ViewGroup.focusSearch(ViewGroup.java:478)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.view.ViewGroup.focusSearch(ViewGroup.java:478)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.view.ViewGroup.focusSearch(ViewGroup.java:478)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.view.ViewGroup.focusSearch(ViewGroup.java:478)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.view.ViewGroup.focusSearch(ViewGroup.java:478)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.view.ViewGroup.focusSearch(ViewGroup.java:478)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.view.View.focusSearch(View.java:3494)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.widget.TextView.onCreateInputConnection(TextView.java:4611)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.view.inputmethod.InputMethodManager.startInputInner(InputMethodManager.java:942)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.view.inputmethod.InputMethodManager.restartInput(InputMethodManager.java:897)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.widget.TextView.setText(TextView.java:2649)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.widget.TextView.setText(TextView.java:2598)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.widget.EditText.setText(EditText.java:78)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.widget.TextView.setText(TextView.java:2573)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.widget.NumberPicker.updateView(NumberPicker.java:356)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.widget.NumberPicker.setCurrent(NumberPicker.java:292)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.widget.TimePicker.updateHourDisplay(TimePicker.java:333)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.widget.TimePicker.setCurrentHour(TimePicker.java:281)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.app.TimePickerDialog.updateTime(TimePickerDialog.java:135)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at com.example.pickerdialog.RangeTimePickerDialog.onTimeChanged(RangeTimePickerDialog.java:75)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.widget.TimePicker.onTimeChanged(TimePicker.java:352)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.widget.TimePicker.updateHourDisplay(TimePicker.java:336)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.widget.TimePicker.setCurrentHour(TimePicker.java:281)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.app.TimePickerDialog.updateTime(TimePickerDialog.java:135)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at com.example.pickerdialog.RangeTimePickerDialog.onTimeChanged(RangeTimePickerDialog.java:75)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.widget.TimePicker.onTimeChanged(TimePicker.java:352)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.widget.TimePicker.updateHourDisplay(TimePicker.java:336)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.widget.TimePicker.setCurrentHour(TimePicker.java:281)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.app.TimePickerDialog.updateTime(TimePickerDialog.java:135)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at com.example.pickerdialog.RangeTimePickerDialog.onTimeChanged(RangeTimePickerDialog.java:75)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.widget.TimePicker.onTimeChanged(TimePicker.java:352)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.widget.TimePicker.updateHourDisplay(TimePicker.java:336)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.widget.TimePicker.setCurrentHour(TimePicker.java:281)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.app.TimePickerDialog.updateTime(TimePickerDialog.java:135)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at com.example.pickerdialog.RangeTimePickerDialog.onTimeChanged(RangeTimePickerDialog.java:75)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.widget.TimePicker.onTimeChanged(TimePicker.java:352)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.widget.TimePicker.updateHourDisplay(TimePicker.java:336)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.widget.TimePicker.setCurrentHour(TimePicker.java:281)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.app.TimePickerDialog.updateTime(TimePickerDialog.java:135)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at com.example.pickerdialog.RangeTimePickerDialog.onTimeChanged(RangeTimePickerDialog.java:75)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.widget.TimePicker.onTimeChanged(TimePicker.java:352)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.widget.TimePicker.updateHourDisplay(TimePicker.java:336)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.widget.TimePicker.setCurrentHour(TimePicker.java:281)
09-06 11:34:25.111: E/AndroidRuntime(1213):     at android.app.Ti
09-06 11:34:29.132: I/Process(1213): Sending signal. PID: 1213 SIG: 9

最佳答案

你有无限递归。您的 onTimeChanged() 在时间选择器上调用 updateTime(),这又会导致对 onTimeChanged() 的另一个调用。

修复它的一种方法是在您的类中添加一个 bool 标志,以防止对 updateTime() 的递归调用。像这样的东西:

boolean mIsOnTimeChanged;

@Override
public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
  if (!mIsOnTimeChanged) {
    mIsOnTimeChanged = true;

    // your regular onTimeChanged() here

    mIsOnTimeChanged = false;
  }
}

关于android - TimePicker 在 4 版 android 上工作正常,但在 2.3 版中出现崩溃错误。 (安卓),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18657177/

相关文章:

json - ObservedObject,派生自Json,不加载到Picker,而是加载到List。在 SwiftUI 中,Xcode 11

swift - 类型 '()'不能符合View(除非它肯定是一个View,这次没有恶作剧)

iOS UI 测试以调整 SwiftUI 应用程序上的选择器值

android - Facebook 如何衡量应用安装 - Android/IOS

php - 在 Php 中将一周的开始日期从 'monday' 更改为 'tuesday'

java - 如何获取 sun.misc.BASE64Encoder 类的 JAR 文件?

MySQL FORMAT_DATE %d 返回 '0'

swift - 将日期添加到日期并计算差异不会导致预期结果

java - Android SQLite 查询与 'WHERE' 选择参数不起作用

Android SpannableString 在部分文本后面设置背景