getIntent() 返回 null

huangapple 未分类评论46阅读模式
英文:

getIntent() returning null

问题

Here's the translated content:

我一直在尝试从片段CrimeFragment中使用startActivityForResult(IntentrequestCode)启动活动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

huangapple
  • 本文由 发表于 2020年7月26日 04:03:49
  • 转载请务必保留本文链接:https://java.coder-hub.com/63093030.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定