Android应用程序在nougat TimePickerDialog中崩溃,Eclipse项目
当我试图显示Android应用程序在nougat TimePickerDialog中崩溃,Eclipse项目,android,android-7.0-nougat,Android,Android 7.0 Nougat,当我试图显示TimePickerDialog应用程序崩溃时,该项目是在每个牛轧糖设备的EclipseIDE中开发的 下面是我的代码 public class FragementMailScreen extends Fragment implements OnClickListener { TimePickerDialog mTimePicker; Calendar mcurrentTime; @Override public View onCreateView(LayoutInflater in
TimePickerDialog
应用程序崩溃时,该项目是在每个牛轧糖设备的EclipseIDE中开发的
下面是我的代码
public class FragementMailScreen extends Fragment implements OnClickListener {
TimePickerDialog mTimePicker;
Calendar mcurrentTime;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.layout_main_screen);
mainView = inflater.inflate(R.layout.fragment_mail_screen, container,
false);
pref = new AppPreferences(getActivity().getApplicationContext());
typeface = Typeface.createFromAsset(getActivity().getAssets(),
getString(R.string.font_name));
txtTopTitle = (TextView) mainView.findViewById(R.id.txtTopTitle);
mcurrentTime = Calendar.getInstance();
getAllComponets();
return mainView;
}
private void setDriverMode() {
if (pref.getDriverMode().equals("0")) {
mainView.findViewById(R.id.mainViewMail).setBackgroundColor(
getResources().getColor(R.color.day_backcolor));
} else {
mainView.findViewById(R.id.mainViewMail).setBackgroundColor(
getResources().getColor(R.color.night_backcolor));
}
}
@Override
public void onResume() {
// registerBroadcast();
((MainScreen) getActivity()).mMailFragment = this;
super.onResume();
}
public boolean isFragmentUIActive() {
return isAdded() && !isDetached() && !isRemoving();
}
public static boolean m_iAmVisible;
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
m_iAmVisible = isVisibleToUser;
}
ListView listMessage;
private void getAllComponets() {
listMessage = (ListView) mainView.findViewById(R.id.listMessage);
if (CommonUtilities.isBeta) {
((TextView) (mainView.findViewById(R.id.btnVersion)))
.setText(getString(R.string.text_beta));
} else {
((TextView) (mainView.findViewById(R.id.btnVersion)))
.setText(getString(R.string.text_test));
}
listMessage.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
CommonCode.gps = new GPSTracker(getActivity());
if (CommonCode.gps.isGPSEnabled) {
Messages detail = message.DriverPopupMessageResponse.LstDriverPopupMessageResponse
.get(position);
if (detail.RID == -1) {
final int RType;
// FLG false means Request Going Home
// then RType is 1 else 2
if (detail.FLG)
RType = 2;
else
RType = 1;
if (RType == 1) {
final int c_hour = mcurrentTime
.get(Calendar.HOUR_OF_DAY);
final int c_minute = mcurrentTime
.get(Calendar.MINUTE);
mTimePicker = new TimePickerDialogFixedNougatSpinner(getActivity(),R.style.SpinnerTimePicker,
new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(
TimePicker timePicker,
int selectedHour,
int selectedMinute) {
/* String time = selectedHour + ":"
+ selectedMinute;*/
/*new DriverGoingHome_request()
.execute(time, String
.valueOf(RType));*/
}
}, c_hour, c_minute, true)// Yes 24 hour
// time
{
@Override
public void onTimeChanged(TimePicker view,
int hourOfDay, int minute) {
/* if (hourOfDay < c_hour) {
updateTimeDialog(view, c_hour, c_minute);
} else if (hourOfDay == c_hour
&& minute < c_minute)
updateTimeDialog(view, c_hour, c_minute);*/
}
private void updateTimeDialog(TimePicker view,
int c_hour, int c_minute) {
// TODO Auto-generated method stub
view.setCurrentHour(c_hour);
view.setCurrentMinute(c_minute);
}
};
mTimePicker.setTitle("Select Time");
mTimePicker.show();
// setDividerColor(picker);
/* Button b = mTimePicker
.getButton(DialogInterface.BUTTON_POSITIVE);
if (b != null) {
b.setText("OK");
}
Button b_Neg = mTimePicker
.getButton(DialogInterface.BUTTON_NEGATIVE);
if (b_Neg != null) {
b_Neg.setText("Cancel");
}*/
/* Alert_BUTTON_NEGATIVE(mTimePicker);
Alert_BUTTON_POSITIVE(mTimePicker);
*/
} else {
String time = "";
showAlert(
time,
String.valueOf(RType),
getString(R.string.cancel_request_goingHome));
// new DriverGoingHome_request().execute(time,
// String.valueOf(RType));
}
// mTimePicker.setOnTimeChangedListener(this);
}
公共类TimePickerDialogFixedNougatSpinner扩展了TimePickerDialog{
public TimePickerDialogFixedNougatSpinner(Context context, OnTimeSetListener listener, int hourOfDay, int minute, boolean is24HourView) {
super(context, listener, hourOfDay, minute, is24HourView);
fixSpinner(context, hourOfDay, minute, is24HourView);
}
public TimePickerDialogFixedNougatSpinner(Context context, int themeResId, OnTimeSetListener listener, int hourOfDay, int minute, boolean is24HourView) {
super(context, themeResId, listener, hourOfDay, minute, is24HourView);
fixSpinner(context, hourOfDay, minute, is24HourView);
}
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
final int MODE_SPINNER = 1;
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 == 2) {
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 {
// TimePickerSpinnerDelegate was initially misnamed TimePickerClockDelegate in API 21!
spinnerDelegateClass = Class.forName("android.widget.TimePickerClockDelegate");
}
// In 7.0 Nougat for some reason the timePickerMode is ignored and the delegate is 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;
}
public TimePickerDialogFixedNougatSpinner(上下文上下文,OnTimeSetListener侦听器,int hourOfDay,int minute,布尔值为24hourView){
超级(上下文、侦听器、小时/天、分钟、is24HourView);
固定微调器(上下文、小时、天、分钟、is24HourView);
}
公共时间选择器DialogFixedNougatSpinner(上下文上下文,int-themeResId,OnTimeSetListener侦听器,int-hourOfDay,int-minute,布尔值为24小时视图){
super(上下文、themeResId、侦听器、小时/天、分钟、is24HourView);
固定微调器(上下文、小时、天、分钟、is24HourView);
}
私有void fixSpinner(上下文上下文,int hourOfDay,int minute,布尔值为24小时视图){
如果(Build.VERSION.SDK\u INT>=Build.VERSION\u CODES.LOLLIPOP){//android:timePickerMode微调器和时钟从LOLLIPOP开始
试一试{
//获取主题的android:timePickerMode
最终int模式_微调器=1;
Class styleableClass=Class.forName(“com.android.internal.R$styleable”);
Field timePickerStyleableField=styleableClass.getField(“TimePicker”);
int[]timePickerStyleable=(int[])timePickerStyleableField.get(null);
最终类型Darray a=context.ActainStyleDatAttributes(null,timePickerStyleable,android.R.attr.timePickerStyle,0);
Field timePickerModeStyleableField=styleableClass.getField(“TimePicker\u timePickerMode”);
int timePickerModeStyleable=timePickerModeStyleableField.getInt(null);
final int mode=a.getInt(timePickerModeStyleable,mode_微调器);
a、 回收();
如果(模式==2){
TimePicker TimePicker=(TimePicker)find字段(TimePickerDialog.class,TimePicker.class,“mTimePicker”).get(this);
Class delegateClass=Class.forName(“android.widget.TimePicker$TimePickerDelegate”);
Field delegateField=findField(TimePicker.class,delegateClass,“mDelegate”);
对象委托=delegateField.get(时间选择器);
类喷丝头类;
if(Build.VERSION.SDK_INT!=Build.VERSION_code.LOLLIPOP){
spinnerDelegateClass=Class.forName(“android.widget.TimePickerSpinnerDelegate”);
}否则{
//TimePickerSpinnerDelegate最初在API 21中被错误命名为TimePickerLockDelegate!
spinnerDelegateClass=Class.forName(“android.widget.TimePickerClockDelegate”);
}
//在7.0 Nougat中,由于某种原因,timePickerMode被忽略,委托为TimePickerLockDelegate
if(delegate.getClass()!=spinnerDelegateClass){
delegateField.set(timePicker,null);//抛出TimePickerClockDelegate!
timePicker.removeAllViews();//删除TimePickerLockDelegate视图
构造函数spinnerDelegateConstructor=spinnerDelegateClass.getConstructor(TimePicker.class、Context.class、AttributeSet.class、int.class、int.class);
spinnerDelegateConstructor.setAccessible(true);
//实例化TimePickerSpinnerDelegate
delegate=spinnerDelegateConstructor.newInstance(timePicker,context,null,android.R.attr.timePickerStyle,0);
delegateField.set(timePicker,delegate);//将timePicker.mDelegate设置为微调器委托
//使用TimePickerSpinnerDelegate再次设置时间选择器
timePicker.setIs24HourView(is24HourView);
timePicker.setCurrentHour(HourrofDay);
计时器选择器。设置当前分钟(分钟);
timePicker.setOnTimeChangedListener(此);
}
}
}捕获(例外e){
//抛出新的运行时异常(e);
}
}
}
私有静态字段findField(类objectClass、类fieldClass、字符串expectedName){
试一试{
Field=objectClass.getDeclaredField(expectedName);
字段。setAccessible(true);
返回字段;
}catch(NoSuchFieldException){}//ignore
//如果在预期的ivar名称下未找到,请搜索它
for(字段搜索字段:objectClass.getDeclaredFields()){
if(searchField.getType()==fieldClass){
searchField.setAccessible(true);
返回搜索字段;
}
}
返回null;
}
}将xml代码粘贴到此处同样
二进制xml文件行#20
也是一个问题。查看对话框的布局和TimePickerDialogFixedNougatSpinner.java:60
问题更新。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mainViewMail"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<RelativeLayout
android:id="@+id/topViewMail"
android:layout_width="match_parent"
android:layout_height="45dp"
android:background="@color/blue" >
<TextView
android:id="@+id/txtTopTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:gravity="center_horizontal"
android:textColor="@color/text_color_sub"
android:textSize="@dimen/maintext_size" />
<TextView
android:id="@+id/btnVersion"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="40dp"
android:background="@color/blue"
android:text="@string/text_beta"
android:textColor="@android:color/white"
android:textSize="@dimen/maintext_size_smaller3"
android:textStyle="bold" />
</RelativeLayout>
<ListView
android:id="@+id/listMessage"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:layout_below="@id/topViewMail" >
</ListView>
*/
public TimePickerDialogFixedNougatSpinner(Context context, OnTimeSetListener listener, int hourOfDay, int minute, boolean is24HourView) {
super(context, listener, hourOfDay, minute, is24HourView);
fixSpinner(context, hourOfDay, minute, is24HourView);
}
public TimePickerDialogFixedNougatSpinner(Context context, int themeResId, OnTimeSetListener listener, int hourOfDay, int minute, boolean is24HourView) {
super(context, themeResId, listener, hourOfDay, minute, is24HourView);
fixSpinner(context, hourOfDay, minute, is24HourView);
}
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
final int MODE_SPINNER = 1;
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 == 2) {
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 {
// TimePickerSpinnerDelegate was initially misnamed TimePickerClockDelegate in API 21!
spinnerDelegateClass = Class.forName("android.widget.TimePickerClockDelegate");
}
// In 7.0 Nougat for some reason the timePickerMode is ignored and the delegate is 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;
}