方向更改时强制关闭并打开日期DialogueFragment

Bha*_*iya 5 android datepicker android-fragments

我有一个活动,我想要的只是

Activity - > OnClick of some layout(有textview) - > Open Datepicker - >在txtvalue中设置选中的值

我想要使​​用带有代码的DialogFragment的aceess Datepicker.

package com.app.ourforms.date;

import java.util.Calendar;

import android.app.DatePickerDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.os.Bundle;
import android.util.Log;
import android.widget.DatePicker;
import android.widget.TextView;

public class DatePickerFragment extends DialogFragment implements
        DatePickerDialog.OnDateSetListener {

    TextView txt;

    public DatePickerFragment() {
    }

    public DatePickerFragment(TextView txt) {
        this.txt = txt;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceSateate) {

        Log.i("TAG", "Inside onCreateDialog");
        final Calendar c = Calendar.getInstance();
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int day = c.get(Calendar.DAY_OF_MONTH);

        return new DatePickerDialog(getActivity(), this, year, month, day);
    }

    public void onDateSet(DatePicker view, int year, int month, int day) {
        Log.i("TAG", "Inside onDateSet");
        txt.setText(day + "/" + (month + 1) + "/" + year);
        // Do something with the date chosen
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码当Device没有改变它的方向时工作正常.但是当显示Datepicker并且方向更改时,我将强制关闭,如下所示

01-04 07:34:14.580: E/AndroidRuntime(2375): FATAL EXCEPTION: main
01-04 07:34:14.580: E/AndroidRuntime(2375): java.lang.NullPointerException
01-04 07:34:14.580: E/AndroidRuntime(2375):     at com.app.ourforms.date.DatePickerFragment.onDateSet(DatePickerFragment.java:39)
01-04 07:34:14.580: E/AndroidRuntime(2375):     at android.app.DatePickerDialog.tryNotifyDateSet(DatePickerDialog.java:148)
01-04 07:34:14.580: E/AndroidRuntime(2375):     at android.app.DatePickerDialog.onClick(DatePickerDialog.java:116)
01-04 07:34:14.580: E/AndroidRuntime(2375):     at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
01-04 07:34:14.580: E/AndroidRuntime(2375):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-04 07:34:14.580: E/AndroidRuntime(2375):     at android.os.Looper.loop(Looper.java:137)
01-04 07:34:14.580: E/AndroidRuntime(2375):     at android.app.ActivityThread.main(ActivityThread.java:5039)
01-04 07:34:14.580: E/AndroidRuntime(2375):     at java.lang.reflect.Method.invokeNative(Native Method)
01-04 07:34:14.580: E/AndroidRuntime(2375):     at java.lang.reflect.Method.invoke(Method.java:511)
01-04 07:34:14.580: E/AndroidRuntime(2375):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-04 07:34:14.580: E/AndroidRuntime(2375):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-04 07:34:14.580: E/AndroidRuntime(2375):     at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)

这是我调用DatePickerFragment的方法

public void showDatePickerDialog(View v) {
        Log.i("TAG", "Inside showDatePickerDialog");
        DialogFragment newFragment = new DatePickerFragment((TextView)v);
        newFragment.show(getFragmentManager(), "datePicker");
    }
Run Code Online (Sandbox Code Playgroud)

请帮我摆脱这个.提前致谢.

Ako*_* Cz 1

您的 TextView 引用为空。NPE 位于 DatePickerFragment 的第 39 行。其为 null 的原因是,当方向更改时,会重新创建整个视图层次结构,并且对传入 DatePickerFragment 的 TextView 的引用不再存在。

不要传入 TextView 实例,而是尝试传入 TextView 的 ID。

new DatePickerFragment(v.getId());
Run Code Online (Sandbox Code Playgroud)

然后实施

public Bundle onSaveInstanceState ()
Run Code Online (Sandbox Code Playgroud)

public void onRestoreInstanceState (Bundle savedInstanceState)
Run Code Online (Sandbox Code Playgroud)

当您的 DatePickerDialog 被销毁并重新创建时,保存和恢复 TextView 的 ID。

然后您将需要使用

getActivity().findViewById(your_text_view_ID)
Run Code Online (Sandbox Code Playgroud)

在视图层次结构中找到您的 TextView 实例,以便您可以设置它的文本。