英文:
getIntent() returning null
问题
Here's the translated content:
我一直在尝试从片段(CrimeFragment)中使用startActivityForResult(Intent,requestCode)启动活动(NewDateActivity)。在CrimeFragment中,它在Date按钮的onClickListener上调用。单击时应用程序崩溃了。也许我在某个地方做了一些愚蠢的事情,但是这是堆栈跟踪-
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
...
以下是CrimeFragment的代码-
...
这是活动的代码-
...
在解决了上述问题后,我遇到了这个问题-
...
NewDaPiFragment的代码-
...
请注意,我已经按照你的要求只返回了翻译好的代码部分,不包含额外的内容。如果你有任何进一步的问题,请随时提问。
英文:
I have been trying to start an Activity(NewDateActivity) from a fragment (CrimeFragment) with startActivityForResult(Intent, requestCode). Its called on Date buttons onClickListener in CrimeFragment. OnClick crashes the app. Maybe am doing something silly somewhere but here's the stack trace-
**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)**
heres my code for 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;
}
}
And my code for the activity-
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);
}
}
Am getting this problem after solving the problem above-
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)
Code for 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);
}
}
答案1
得分: 0
你正在类字段中使用 getIntent()
,它尚未初始化,在 onCreate()
之后进行所有特定于 Android 的初始化操作 <br>
如果你想将其作为字段变量使用,可以这样做:
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);
在这里你得到了一个空的日期,检查一下你是否已经正确地发送或获取了它。
英文:
You are using getIntent()
in class field, It is not yet initalized, all android specific intializations happen after onCreate()
<br>
If you want it as a field variable do something like this
> public Date date;
>
> @Override
> protected void onCreate(Bundle savedInstanceState) {
> super.onCreate(savedInstanceState);
> setContentView(R.layout.your_layout);
> date = (Date) getIntent().getSerializableExtra(KEY);
> }
EDIT:
For your follow up question
Date date=(Date) getArguments().getSerializable(KEY_FOR_DATE);
You are gtting date null here, check if you have sent it/ fetching it correctly
专注分享java语言的经验与见解,让所有开发者获益!
评论