【问题标题】:Force close when Orientation Changes with open Date DialogueFragment当打开日期DialogFragment改变方向时强制关闭
【发布时间】:2013-01-04 07:40:04
【问题描述】:

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

Activity--> 某些布局的 OnClick(具有 textview)--> 打开 Datepicker--> 在 txtvalue 中设置选定的值

我想使用带有以下代码的 DialogFragment 访问 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
    }
}

上面的代码当设备不改变其方向时工作正常。但是当显示 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)

这是我调用 DatePickerFragment 的方法

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

请帮助我摆脱困境。 提前致谢。

【问题讨论】:

    标签: android datepicker android-fragments


    【解决方案1】:

    我不确定此解决方案是否适合您,但您可以尝试一下。

    您面临的问题是,每次方向更改时,您的活动都会重新加载。您可以调用OnConfigurationchanged() 方法并在Menifest 文件中将Configuchanges 设置为orientation|screensize

    通过这样做,您的 Activity 将不会在方向更改时加载,并且您将不会再面对您当前面临的问题。

    可以帮助你。

    【讨论】:

      【解决方案2】:

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

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

      new DatePickerFragment(v.getId());
      

      然后实施

      public Bundle onSaveInstanceState ()
      

      public void onRestoreInstanceState (Bundle savedInstanceState)
      

      在 DatePickerDialog 被销毁和重新创建时保存和恢复 TextView 的 ID。

      然后你需要使用

      getActivity().findViewById(your_text_view_ID)
      

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

      【讨论】:

      • 我同意。当 Android 重建你的 Fragment 时,它会调用默认构造函数 (public DatePickerFragment() {})... 引用 documentation,“Fragment 的所有子类必须包含一个公共的空构造函数。框架通常会在需要时重新实例化一个 Fragment 类,特别是在状态恢复期间,需要能够找到这个构造函数来实例化它。”
      • @Akos Cz:我知道我为什么会得到这个。我想通过修改此代码来克服这种情况。你能帮我如何将这个 textview id 传递给片段吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多