意图传递日期导致空

问题描述:

我搜索,没有发现任何解释为什么空是意图的结果,如:意图传递日期导致空

How to get Date extra from an intent?

Android: Passing Date in putExra

看来,意图不通过任何东西我的代码作为我的代码导致NullPointerException(我正在通过Big Nerd Ranch的“Android Programming”工作):

首先,我声明并定义密钥EXTRA_DATE并在CrimeFragmen中创建Intent吨的代码(注意:这是在代码如下所示的logcat的输出中使用的TAG),在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的输出此代码部分(下文)中看到的,'日期”变量在这个点的值,只是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语句指出,DatePickerFragment在import语句引用:

   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(); 
       } 
      } 
     } 

但是,如图中的logcat线在“日期意向立即失败= 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); 

直到空指针异常发生的情况:

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 

如logcat的输出为DatePickerActivity上方观察,日期变量为空,因此null被从该点上所看到从以下logcat的片段通过上面的onCreateView代码。

DatePickerFragment: Entered newInstance 
DatePickerFragment: Date is null 
DatePickerFragment: Entered onCreateView 
DatePickerFragment: Date equals: null 
AndroidRuntime: Shutting down VM 

通过我所有的阅读,包括*.com所有帖子,看来这应该只是工作,这一意图应该简单地从CrimeFragment到DatePickerFragment传递日期值,但它不一样的价值'日期等于空'显示。

似乎没有什么更多的我可以做,意图应该只是通过'日期',但事实并非如此。

+0

我不知道'SingleFragmentActivity'是什么,但只是为了确认,你不需要调用getActivity.getIntent?另外,您确定EXTRA_DATE键完全相同吗? – AChez9

+0

看看这个帖子的接受答案:https://*.com/questions/6751583/is-there-a-method-that-works-like-start-fragment-for-result – Barns

+0

ACex9和Barns52,它必须是EXTRA_DATE键。我真的不明白如何在各种文件中引用它,以便检索类知道它是什么。我正在更新原始帖子,以显示我如何错误地引用该密钥,以便其他人可以更清楚地看到问题,然后使用更正来更新此密码以帮助其他人。 – Jeff

旧大书呆子牧场的人把我带回到没错

DatePickerActivity不知道是什么extra_date。 在你的课堂上没有参考,它不是一个变量。

通常意图演员去像

intent.putExtra(String键,Object对象);

你做了intent.putExtra(EXTRA_DATE,date);这很好 但在检索类中,您需要知道EXTRA_DATE值是什么。

+0

这可能是我的问题所在。至少对我来说,我读过的内容并没有明确地解释这些标记如何在它们被使用的文件中被引用。我正在通过我的代码来更新我的原始文章,以阐明我如何在整个过程中引用EXTRA_DATE各种文件。然后我会试着弄清楚如何在我的代码中正确引用EXTRA_DATE并发布更正以帮助其他人。 – Jeff

感谢sdfbhg,AChez9和Barns52!你们钉了它。因为我没有真正理解我没有正确识别EXTRA_DATE键的关键问题。所以,现在被指向那个方向,我搜索了新的焦点,结果发现:

naming convention for passing data through extras in android

是指出:在该页面的代码

https://developer.android.com/training/basics/firstapp/starting-activity.html#StartActivity

,便有了答案:

String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE); 

请注意源文件的名称是密钥的一部分。所以,我在我的代码改变一个行DatePickerActivity来自:

Date date = (Date) intent.getSerializableExtra(EXTRA_DATE); 

要:

Date date = (Date) intent.getSerializableExtra(CrimeFragment.EXTRA_DATE); 

而且NullPointerException异常是没有更多的,因为我现在引用在源文件中检索文件。教训是正确引用您的密钥。现在我知道我不知道。

还有一件事。我试验过并发现加入: import static com.bignerdranch.android.criminalintent.CrimeFragment.EXTRA_DATE;提供了Date date = (Date) intent.getSerializableExtra(EXTRA_DATE);正常工作的信息。因此,有两种方法可将关键参考信息提供给您的意图呼叫。