getIntent() returning null



我一直在尝试使用startActivityForResult(Intent,requestCode(从片段(CrimeFragment(启动活动(NewDateActivity(。它调用了CrimeFragment中ClickListener上的Date按钮。OnClick使应用程序崩溃。也许我在某个地方做了一些愚蠢的事情,但这是堆栈跟踪-

**2020-07-25 20:35:15.750 19741-19741/com.bignerdranch.criminalintent E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.bignerdranch.criminalintent, PID: 19741
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.bignerdranch.criminalintent/com.bignerdranch.criminalintent.NewDateActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.Serializable android.content.Intent.getSerializableExtra(java.lang.String)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java)
at android.app.ActivityThread.-wrap14(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java)
at android.os.Handler.dispatchMessage(Handler.java)
at android.os.Looper.loop(Looper.java)
at android.app.ActivityThread.main(ActivityThread.java)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.Serializable android.content.Intent.getSerializableExtra(java.lang.String)' on a null object reference
at com.bignerdranch.criminalintent.NewDateActivity.<init>(NewDateActivity.java:16)
at java.lang.Class.newInstance(Native Method)
at android.app.Instrumentation.newActivity(Instrumentation.java)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java) 
at android.app.ActivityThread.-wrap14(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java) 
at android.os.Handler.dispatchMessage(Handler.java) 
at android.os.Looper.loop(Looper.java) 
at android.app.ActivityThread.main(ActivityThread.java) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java)**

这是我的CrimeFragment-代码


import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import java.util.Date;
import java.util.UUID;
public class CrimeFragment extends Fragment {
private Crime mCrime;
private EditText mTitleField;
private Button mDateButton;
private CheckBox mSolvedCheckBox;
private Button mLastButton;
private Button mFirstButton;
public static final String ARGS_CRIME_ID = "crime id bruh";
private static final String DIALOG_DATE="dialogdate";
private static final int REQUEST_DATE=0;
private Button mTimeButton;
private  String TIME_TAG="tag for showing timefragment";
private static final int REQUEST_TIME=1;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
UUID position=(UUID) getArguments().getSerializable(ARGS_CRIME_ID);
mCrime=CrimeLab.get(getActivity()).getCrime(position);
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v=inflater.inflate(R.layout.fragment_crime, container, false);

mSolvedCheckBox=(CheckBox) v.findViewById(R.id.crime_solved);
mSolvedCheckBox.setChecked(mCrime.isSolved());
mSolvedCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
mCrime.setSolved(isChecked);
}
});

mFirstButton=(Button) v.findViewById(R.id.first_button);
mLastButton=(Button) v.findViewById(R.id.last_button);
if (CrimePagerActivity.mViewPager.getCurrentItem()==0){
mFirstButton.setEnabled(false);
} else if (CrimePagerActivity.mViewPager.getCurrentItem()==99){
mLastButton.setEnabled(false);
}
mFirstButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
CrimePagerActivity.jumpToFirst();
}
});
mLastButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
CrimePagerActivity.jumpToLast();
}
});

mTitleField=(EditText) v.findViewById(R.id.crime_title);
mTitleField.setText(mCrime.getTitle());
mDateButton=(Button) v.findViewById(R.id.crime_date);
updateDate();
mDateButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
Intent data= NewDateActivity.newIntent(getActivity(), mCrime.getDate());
startActivityForResult(data, REQUEST_DATE);
}
});
mTimeButton=(Button) v.findViewById(R.id.time_button);
mTimeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager manager=getFragmentManager();
TimePickerFragment fragment= new TimePickerFragment();
fragment.show(manager, TIME_TAG);
}
});
mTitleField.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
mCrime.setTitle(s.toString());
}
@Override
public void afterTextChanged(Editable s) {
}
});
return v;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data){
if(resultCode!= Activity.RESULT_OK){
return;
}
if (requestCode==REQUEST_DATE){
Date date=(Date) data.getSerializableExtra(NewDaPiFragment.KEY_FOR_DATE2);
mCrime.setDate(date);
updateDate();
}
if (requestCode==REQUEST_TIME){
String hour=String.valueOf(data.getIntExtra(TimePickerFragment.HOUR_KEY, 0));
String minutes=String.valueOf(data.getIntExtra(TimePickerFragment.Minute_KEY, 0));
String time=hour+ ":"+ minutes;
}
}
private void updateDate() {
mDateButton.setText(mCrime.getDate().toString());
}

public static CrimeFragment newInstance( UUID position){
Bundle args= new Bundle();
args.putSerializable(ARGS_CRIME_ID, position);
CrimeFragment fragment= new CrimeFragment();
fragment.setArguments(args);
return fragment;
}
}

我的活动代码-

package com.bignerdranch.criminalintent;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import java.util.Date;
public class NewDateActivity extends SingleFragmentActivity {
private static final String KEY="a string key for extracting date";

**public Date date=(Date) getIntent().getSerializableExtra(KEY);

public static Intent newIntent(Context packageContext, Date date){
Intent intent=new Intent(packageContext, NewDateActivity.class );
intent.putExtra(KEY, date);
return intent;
}
@Override
protected Fragment createFragment() {
return NewDaPiFragment.newInstance(date);
}
}

我在解决了上面的问题后遇到了这个问题-

2020-07-26 11:42:36.677 17763-17763/com.bignerdranch.criminalintent E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.bignerdranch.criminalintent, PID: 17763
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.bignerdranch.criminalintent/com.bignerdranch.criminalintent.NewDateActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'long java.util.Date.getTime()' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java)
at android.app.ActivityThread.-wrap14(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java)
at android.os.Handler.dispatchMessage(Handler.java)
at android.os.Looper.loop(Looper.java)
at android.app.ActivityThread.main(ActivityThread.java)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'long java.util.Date.getTime()' on a null object reference
at java.util.Calendar.setTime(Calendar.java)
at com.bignerdranch.criminalintent.NewDaPiFragment.onViewCreated(NewDaPiFragment.java:42)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:892)
at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303)
at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:439)
at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2079)
at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1869)
at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1824)
at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1727)
at androidx.fragment.app.FragmentManagerImpl.dispatchStateChange(FragmentManagerImpl.java:2663)
at androidx.fragment.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManagerImpl.java:2613)
at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:246)
at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:542)
at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:201)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java)
at android.app.Activity.performStart(Activity.java)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java) 
at android.app.ActivityThread.-wrap14(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java) 
at android.os.Handler.dispatchMessage(Handler.java) 
at android.os.Looper.loop(Looper.java) 
at android.app.ActivityThread.main(ActivityThread.java) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java)

NewDaPiFragment-代码

package com.bignerdranch.criminalintent;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.DatePicker;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
public class NewDaPiFragment extends Fragment {
private DatePicker mDatePicker;
private Button mOkButton;
public static final String KEY_FOR_DATE="a key that will be used for dates";
public static final String KEY_FOR_DATE2="another key for dates";
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v= inflater.inflate(R.layout.dialog_date, container, false);
return v;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
View v=view;

mDatePicker=(DatePicker) v.findViewById(R.id.dialog_date_picker);
mOkButton=(Button) v.findViewById(R.id.positive_buttton);
Date date=(Date) getArguments().getSerializable(KEY_FOR_DATE);
Calendar calendar=Calendar.getInstance();
calendar.setTime(date);
int year =calendar.get(Calendar.YEAR);
int month=calendar.get(Calendar.MONTH);
int day=calendar.get(Calendar.DAY_OF_MONTH);
mDatePicker.init(year, month,day, null );
mOkButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
int year=mDatePicker.getYear();
int month=mDatePicker.getMonth();
int day=mDatePicker.getDayOfMonth();
Date date1=new GregorianCalendar(year,month,day).getTime();
sendResult(Activity.RESULT_OK, date1);
}
});
}
public static Fragment newInstance(Date date){
Bundle args=new Bundle();
args.putSerializable(KEY_FOR_DATE, date);
Fragment fragment=new NewDaPiFragment();
fragment.setArguments(args);
return fragment;
}
private void sendResult(int resultCode, Date date){
Intent data=new Intent();
data.putExtra(KEY_FOR_DATE2, date);
getActivity().setResult(resultCode, data);
}
}

您在类字段中使用getIntent(),它尚未初始化,所有android特定的初始化都发生在onCreate()之后
如果您想将其作为字段变量,请执行类似的操作

public Date date;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.your_layout);
date = (Date) getIntent().getSerializableExtra(KEY);
}

编辑:

对于您的后续问题

Date date=(Date) getArguments().getSerializable(KEY_FOR_DATE);

您在此处输入的日期为空,请检查您是否已正确发送/提取

最新更新