Для lolipop и более высокой версии Android вы можете использовать этот модифицированный класс RangeTimePickerDialog
(от lolipop, Timepicker использует режим часов (дизайн материала) по умолчанию, чтобы старый пользовательский класс не работал. Мы можем изменить режим для вращения для последней версии и может повторно использовать класс)
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, int dialogTheme, OnTimeSetListener callBack, int hourOfDay, int minute, boolean is24HourView) {
super(context, callBack, hourOfDay, minute, is24HourView);
currentHour = hourOfDay;
currentMinute = minute;
dateFormat = DateFormat.getTimeInstance(DateFormat.SHORT);
fixSpinner(context, hourOfDay, minute, is24HourView);
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);
}
private void fixSpinner(Context context, int hourOfDay, int minute, boolean is24HourView) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // android:timePickerMode spinner and clock began in Lollipop
try {
// Get the theme's android:timePickerMode
//two modes are available clock mode and spinner mode ... selecting spinner mode for latest versions
final int MODE_SPINNER = 2;
Class<?> styleableClass = Class.forName("com.android.internal.R$styleable");
Field timePickerStyleableField = styleableClass.getField("TimePicker");
int[] timePickerStyleable = (int[]) timePickerStyleableField.get(null);
final TypedArray a = context.obtainStyledAttributes(null, timePickerStyleable, android.R.attr.timePickerStyle, 0);
Field timePickerModeStyleableField = styleableClass.getField("TimePicker_timePickerMode");
int timePickerModeStyleable = timePickerModeStyleableField.getInt(null);
final int mode = a.getInt(timePickerModeStyleable, MODE_SPINNER);
a.recycle();
if (mode == MODE_SPINNER) {
TimePicker timePicker = (TimePicker) findField(TimePickerDialog.class, TimePicker.class, "mTimePicker").get(this);
Class<?> delegateClass = Class.forName("android.widget.TimePicker$TimePickerDelegate");
Field delegateField = findField(TimePicker.class, delegateClass, "mDelegate");
Object delegate = delegateField.get(timePicker);
Class<?> spinnerDelegateClass;
if (Build.VERSION.SDK_INT != Build.VERSION_CODES.LOLLIPOP) {
spinnerDelegateClass = Class.forName("android.widget.TimePickerSpinnerDelegate");
} else {
spinnerDelegateClass = Class.forName("android.widget.TimePickerClockDelegate");
}
if (delegate.getClass() != spinnerDelegateClass) {
delegateField.set(timePicker, null); // throw out the TimePickerClockDelegate!
timePicker.removeAllViews(); // remove the TimePickerClockDelegate views
Constructor spinnerDelegateConstructor = spinnerDelegateClass.getConstructor(TimePicker.class, Context.class, AttributeSet.class, int.class, int.class);
spinnerDelegateConstructor.setAccessible(true);
// Instantiate a TimePickerSpinnerDelegate
delegate = spinnerDelegateConstructor.newInstance(timePicker, context, null, android.R.attr.timePickerStyle, 0);
delegateField.set(timePicker, delegate); // set the TimePicker.mDelegate to the spinner delegate
// Set up the TimePicker again, with the TimePickerSpinnerDelegate
timePicker.setIs24HourView(is24HourView);
timePicker.setCurrentHour(hourOfDay);
timePicker.setCurrentMinute(minute);
timePicker.setOnTimeChangedListener(this);
}
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
private static Field findField(Class objectClass, Class fieldClass, String expectedName) {
try {
Field field = objectClass.getDeclaredField(expectedName);
field.setAccessible(true);
return field;
} catch (NoSuchFieldException e) {} // ignore
// search for it if it wasn't found under the expected ivar name
for (Field searchField : objectClass.getDeclaredFields()) {
if (searchField.getType() == fieldClass) {
searchField.setAccessible(true);
return searchField;
}
}
return null;
}
}
Редактирование 2 (2017):
Во всех современных браузерах можно просто звонить: console.trace();
(Ссылка MDN)
Редактирование 1 (2013):
А лучше (и более простой) решение, как указано в комментариях к исходному вопросу состоит в том, чтобы использовать stack
свойство Error
объект как так:
function stackTrace() {
var err = new Error();
return err.stack;
}
Это генерирует вывод как это:
DBX.Utils.stackTrace@http://localhost:49573/assets/js/scripts.js:44
DBX.Console.Debug@http://localhost:49573/assets/js/scripts.js:9
.success@http://localhost:49573/:462
x.Callbacks/c@http://localhost:49573/assets/js/jquery-1.10.2.min.js:4
x.Callbacks/p.fireWith@http://localhost:49573/assets/js/jquery-1.10.2.min.js:4
k@http://localhost:49573/assets/js/jquery-1.10.2.min.js:6
.send/r@http://localhost:49573/assets/js/jquery-1.10.2.min.js:6
Давание названия вызова функционируют наряду с URL, его функцией вызова, и так далее.
Оригинал (2009):
А изменил версию , этот отрывок может несколько помочь:
function stacktrace() {
function st2(f) {
return !f ? [] :
st2(f.caller).concat([f.toString().split('(')[0].substring(9) + '(' + f.arguments.join(',') + ')']);
}
return st2(arguments.callee.caller);
}
Легче получить отслеживание стека на Firefox, чем это находится на IE, но существенно вот то, что Вы хотите сделать:
Обертка "проблематичная" часть кода в блоке попытки/выгоды:
try {
// some code that doesn't work
var t = null;
var n = t.not_a_value;
}
catch(e) {
}
при исследовании содержания "ошибочного" объекта, он содержит следующие поля:
e.fileName: исходный файл / страница, куда проблема прибыла из e.lineNumber: номер строки в файле/страница, где проблема возникла e.message: простое сообщение, описывающее, какая ошибка произошла e.name: тип ошибки, которая произошла, в примере выше его должен быть 'TypeError' e.stack: Содержит отслеживание стека, которое вызвало исключение
, я надеюсь, что это выручает Вас.
Я не думаю, что существует что-либо созданное, в котором можно использовать однако, я действительно находил много примеров людей, прокручивающих их собственное.
Если у Вас есть поджигатель, существует повреждение на всей ошибочной опции на вкладке сценария. Как только сценарий поразил Вашу точку останова, можно посмотреть на окно стека поджигателя:
Вы можете получить доступ к стеку
( stacktrace
в Opera) свойствам экземпляра Error
даже если вы его бросили. Дело в том, что вам нужно убедиться, что вы используете throw new Error (string)
(не забудьте new вместо throw string
.
Пример:
try {
0++;
} catch (e) {
var myStackTrace = e.stack || e.stacktrace || "";
}
@Bean
в одном из эти@Configuration
классы и добавляет, создают его через его бобовый метод. – Alexander Pogrebnyak 25 April 2013 в 14:16