我搜了一下,没有发现什么可以解释为什么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/