java - Intent 传递日期结果为空

标签 java android android-intent nullpointerexception

我搜了一下,没有发现什么可以解释为什么Intent的结果为null,如:

How to get Date extra from an intent?

Android: Passing Date in putExra

看来 Intent 没有在我的代码中传递任何内容,因为我的代码导致 NullPointerException(我正在研究 Big Nerd Ranch 的“Android 编程”):

首先,我声明并定义键 EXTRA_DATE 并在 CrimeFragment 的代码中创建 Intent(注意:这是代码下方所示的 LogCat 输出中使用的标记),在 else 语句中:

      public static final String EXTRA_DATE = "date";
      private static Date date = null;
      ...

        if (small screen) {
             //small screen code
        } else {
            Log.d(TAG, "Large screen: activity");
            date = mCrime.getDate();
            Log.d(TAG, "date is " + date);
            Intent intent = new Intent(getContext(), DatePickerActivity.class);
            intent.putExtra(EXTRA_DATE, date);
            startActivityForResult(intent, REQUEST_DATE);
        }

正如此代码部分的 LogCat 输出(如下)所示,“date”变量此时有一个值,就在使用 Intant 发送之前:

CrimeFragment: Large screen: activity
CrimeFragment: date is Mon Oct 16 18:19:24 CDT 2017

startActivityForResult 然后启动 DatePickerActivity,并输入 createFragment(Android Studio 建议我添加导入,我这样做了):

import static com.bignerdranch.android.criminalintent.DatePickerFragment.EXTRA_DATE;

public class DatePickerActivity extends SingleFragmentActivity {
    private final String TAG = "DatePickerActivity";
    private static final int REQUEST_DATE = 0;

@Override
protected Fragment createFragment() {
    Log.d(TAG, "Entered createFragment");
    Date date = (Date) getIntent().getSerializableExtra(EXTRA_DATE);
    Log.d(TAG,"date = " + date);
    return DatePickerFragment.newInstance(date);
}

如导入语句中所述,导入语句中引用了 DatePickerFragment:

              public static DatePickerFragment newInstance(Date date){
                    Log.d(TAG, "Entered newInstance");
                    Log.d(TAG, "Date is " + date);
                    Bundle args = new Bundle();
                    args.putSerializable(EXTRA_DATE, date);
                    DatePickerFragment fragment = new DatePickerFragment();
                    fragment.setArguments(args);
                   return fragment;
               }

SingleFragmentActivity 已扩展:

        public abstract class SingleFragmentActivity extends AppCompatActivity {
            protected abstract Fragment createFragment();
            private static final String TAG= "SingleFragmentActivity";

            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                Log.d(TAG, "Entered onCreate");
                setContentView(R.layout.activity_fragment);

                FragmentManager fm = getSupportFragmentManager();
                 //fragment_container is the top level FrameLayout in activity_fragment
                Fragment fragment = fm.findFragmentById(R.id.fragment_container);

                if (fragment == null){
                    fragment = createFragment();
                    fm.beginTransaction().add(R.id.fragment_container, fragment).commit();
                }
            }
        }

但是 Intent 立即失败,如 LogCat 行所示,其中“date = null”:

CrimeFragment: Entered onPause
CrimeFragment: Entered onPause
SingleFragmentActivity: Entered onCreate
DatePickerActivity: Entered createFragment
DatePickerActivity: date = null

此空值现已传递给 DatePickerFragment:

public class DatePickerFragment extends DialogFragment {
    public static final String EXTRA_DATE = "com.bignerdranch.android.criminalintent.date";
    private static final String ARG_DATE = "Date";
    private static final String TAG = "DatePickerFragment";

    private DatePicker mDatePicker;

public static DatePickerFragment newInstance(Date date){
    Log.d(TAG, "Entered newInstance");
    Log.d(TAG, "Date is " + date);
    Bundle args = new Bundle();
    args.putSerializable(ARG_DATE, date);
    DatePickerFragment fragment = new DatePickerFragment();
    fragment.setArguments(args);
    return fragment;
}

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
                       @Nullable Bundle savedInstanceState){
    Log.d(TAG, "Entered onCreateView");
    Date date = (Date) getArguments().getSerializable(EXTRA_DATE);
    Log.d(TAG, "Date equals: " + date);
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);

直到 NullPointerException 发生:

java.lang.RuntimeException: Unable to start activity 
ComponentInfo{com.bignerdranch.android.criminalintent/com.bignerdranch. 
android.criminalintent.DatePickerActivity}: java.lang.NullPointerException:
Attempt to invoke virtual method ‘long java.util.Date.getTime()’ on a null 
object reference

如上面 DatePickerActivity 的 LogCat 输出所示,日期变量为 null,因此从该点开始传递 null,如上面 onCreateView 代码中的以下 LogCat fragment 所示。

DatePickerFragment: Entered newInstance
DatePickerFragment: Date is null
DatePickerFragment: Entered onCreateView
DatePickerFragment: Date equals: null
AndroidRuntime: Shutting down VM

通过我的所有阅读,包括 stackoverflow.com 中的所有帖子,似乎这应该可行,Intent 应该简单地将 Date 值从 CrimeFragment 传递到 DatePickerFragment,但它并不像“Date equals null”的值所示。

似乎我没有什么可做的,Intent 应该只传递“日期”,但事实并非如此。

最佳答案

老大 Nerd Rancher 带我回来是的

DatePickerActivity 不知道 extra_date 是什么。 您的类中没有对它的引用,它不是变量。

通常 Intent 额外的事情就像

intent.putExtra(String key, Object 对象);

你做了intent.putExtra(EXTRA_DATE, date);这很好 但在检索类中,您需要知道 EXTRA_DATE 值是什么。

关于java - Intent 传递日期结果为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46798999/

相关文章:

java - 无法使用自定义项目颜色设置服务布局样式

java - 在 try-catch block 中捕获 InputMidmatchException 时无限循环

android - Youtube 视频不会在带有 View 寻呼机的 fragment 内的 WebView 中停止

android - 谁应该在什么时候处置 Intent ?

java - 在同一任务中打开另一个应用程序的 Activity ?

android - 如何更改primary和primaryDark颜色?

HttpClient 中的 JavaScript 上下文

java - 在 JAXB 2.0 中扩展 JAXB 生成的对象

android - 使用 fusedlocationapi 获取位置,而无需在时间间隔后请求位置更新

java - intent.resolveActivity(getPackageManager()) 究竟在做什么?