【发布时间】: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