代码之家  ›  专栏  ›  技术社区  ›  Jeff

意图传递日期结果为空

  •  1
  • Jeff  · 技术社区  · 8 年前

    我搜索了一下,没有找到任何解释为什么null是意图的结果,例如:

    How to get Date extra from an intent?

    Android: Passing Date in putExra

    看来Intent并没有在我的代码中传递任何东西,因为我的代码会导致NullPointerException(我正在研究Big Nerd Ranch的“Android编程”:

    首先,我在else语句中声明并定义键EXTRA_DATE,并在CrimeFragment的代码中创建意图(注意:这是代码下面显示的LogCat输出中使用的标记):

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

    如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;
                   }
    

            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行所示,其中“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片段所示。

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

    通过我所有的阅读,包括stackoverflow中的所有帖子。com,似乎这应该是可行的,意图应该只是将日期值从CrimeFragment传递到DatePickerFragment,但它并不像“Date等于null”的值所示。

    似乎我没什么可做的了,那个意图应该只是通过“日期”,但事实并非如此。

    2 回复  |  直到 8 年前
        1
  •  0
  •   sdfbhg    8 年前

    老大书呆子牧场人带我回来是的

    DatePickerActivity不知道额外的日期是什么。 在您的类中没有对它的引用,它不是一个变量。

    通常情况下,有意向的临时演员

    意图putExtra(字符串键,Object Object);

    你确实是故意的。putExtra(EXTRA_DATE,DATE);这很好 但是在检索类中,您需要知道额外的日期值是什么。

        2
  •  0
  •   Jeff    8 年前

    感谢sdfbhg、AChez9和Barns52!你们搞定了。因为我没有真正理解关键问题,我没有正确识别额外的日期键。因此,现在正朝着这个方向,我以一个新的焦点进行搜索,发现:

    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); 正确工作。因此,有两种方法可以为您的意向通话提供关键参考信息。