【问题标题】:Intent passing Date results in null意图传递日期结果为空
【发布时间】:2017-10-17 20:49:14
【问题描述】:

我搜了一下,没有找到解释为什么null是Intent的结果,比如:

How to get Date extra from an intent?

Android: Passing Date in putExra

似乎 Intent 没有在我的代码中传递任何内容,因为我的代码导致 NullPointerException(我正在通过 Big Nerd Ranch 完成“Android 编程”):

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

      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 输出中可以看出(如下),“日期”变量此时有一个值,就在使用 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);
}

如 import 语句中所述,在 import 语句中引用了 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 sn-p 所示。

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 的值等于 null ' 显示。

看来我没有什么可做的了,Intent 应该只是传递“日期”,但它没有。

【问题讨论】:

  • 我不知道'SingleFragmentActivity'是什么,只是为了确认一下,你不需要调用getActivity.getIntent吗?另外,您确定 EXTRA_DATE 键完全相同吗?
  • 看看这个帖子的接受答案:stackoverflow.com/questions/6751583/…
  • ACex9 和 Barns52,它必须是 EXTRA_DATE 键。我真的不明白它必须如何在各种文件中引用,以便检索类知道它是什么。我正在更新原始帖子以显示我如何错误地引用了该密钥,以便其他人可以更清楚地看到问题,然后将通过更正进行更新以帮助其他人。

标签: java android android-intent nullpointerexception


【解决方案1】:

牧场老大书呆子带我回去是的

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

通常意图附加内容像

intent.putExtra(String key, Object object);

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

【讨论】:

  • 这可能是我的问题所在。至少对我而言,我所读到的内容并没有明显地解释如何在使用它们的文件中引用这些标签。我正在通过我的代码来更新我的原始帖子,以澄清我是如何引用 EXTRA_DATE 的各种文件。然后,我将尝试弄清楚如何在我的代码中正确引用 EXTRA_DATE 并发布更正以帮助其他人。
【解决方案2】:

感谢 sdfbhg、AChez9 和 Barns52!你们搞定了。因为我并没有真正理解关键问题,所以我没有正确识别 EXTRA_DATE 键。所以,现在被指向那个方向,我用新的焦点搜索并发现:

naming convention for passing data through extras in android

指向:

https://developer.android.com/training/basics/firstapp/starting-activity.html#StartActivity

在该页面的代码中,有答案:

String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);

请注意,源文件的名称是密钥的一部分。所以,我在 DatePickerActivity 的代码中更改了一行:

    Date date = (Date) intent.getSerializableExtra(EXTRA_DATE);

收件人:

    Date date = (Date) intent.getSerializableExtra(CrimeFragment.EXTRA_DATE);

并且 NullPointerException 不再存在,因为我现在在检索文件中引用了源文件。课程是正确引用您的密钥。现在我知道我不知道。

还有一件事。我进行了实验,发现添加: import static com.bignerdranch.android.criminalintent.CrimeFragment.EXTRA_DATE; 提供了Date date = (Date) intent.getSerializableExtra(EXTRA_DATE); 正常工作的信息。因此,有两种方法可以为您的 Intent 调用提供关键参考信息。

【讨论】:

    猜你喜欢
    • 2012-01-05
    • 2021-07-28
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多