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