Android:捆绑NullPointerException [英] Android: Bundle NullPointerException

查看:71
本文介绍了Android:捆绑NullPointerException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发一个应用程序,我需要将一些数据从ListFragment发送到ItemFragment。我使用包,但得到nullpointerexception。我应该提到我是新手,这是我的第一个应用程序。因此,请让我知道我的做法是否错误或令人困惑。这是我的代码

I'm working on an app I need to send some data from ListFragment to ItemFragment. I use bundle but I get nullpointerexception. I should mention that i'm a newbie and this is my first app. so let me know if what I did is wrong or confusing. Here are my codes

ListFragment.java

            if (child != null && mGestureDetector.onTouchEvent(motionEvent)) {
                int position = recyclerView.getChildLayoutPosition(child);
                selectedItem = mItems.get(position);
                itemId = mItems.get(position).getId();
                openFragment(new ItemFragment(), "MyApp");
                ItemFragment if = new ItemFragment();
                Bundle bundle = new Bundle();
                bundle.putLong("selectedId", itemId);
                if.setArguments(bundle);
}
            return false;
        }

ItemFragment.java

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {


    Bundle bundledData = this.getArguments();
    selectedId = bundledData.getLong("selectedId");//here is the line 105 in logcat

    return mRootView;
}

Logcat

java.lang.NullPointerException
at me.myapp.fragments.ItemFragment.onCreateView(ItemFragment.java:105)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:1962)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:517)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5001)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)

---添加---

出于某种原因,我当我在这里尝试答案时,仍然会遇到同样的错误,除了阮的。据我对nguyen代码的理解,我使用此

For some reason, I still get the same error when I tried the answers here except for nguyen's. From what I understand in nguyen's code, I use this

ListFragment.java

private long itemId;

if (child != null && mGestureDetector.onTouchEvent(motionEvent)) {
                int position = recyclerView.getChildLayoutPosition(child);
                selectedItem = mItems.get(position);
                itemId = mItems.get(position).getId();
                Bundle bundle = new Bundle();
                bundle.putLong("selectedId", itemId);
                ItemFragment itemFrag = ItemFragment.newInstance(bundle);
                openFragment(new ItemFragment(), "Update Item");
                Toast.makeText(getActivity(), "id = " + itemId, Toast.LENGTH_SHORT).show();

ItemFragment.java

private long selId;

public static ItemFragment newInstance(Bundle bundle) {
    ItemFragment frag = new ItemFragment();
    frag.setArguments(bundle);
    return frag;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    if (getArguments() != null) {
         selId = getArguments().getLong("selectedId");
    }
    makeToast(""+selId);

return mRootView;
}

这些代码没有任何错误。 ListFragment中的Toast确实显示了正确的值,但ItemFragment中的Toast始终返回0。我在这里缺少什么?

I didn't get any error with these codes. The toast in ListFragment does shows the correct value but the toast in ItemFragment always returns 0. what am i missing here??

推荐答案

经过数小时的时间,弄乱了代码,反复试验,尝试了不同的代码,nguyen的代码以及此处的代码 https://stackoverflow.com/ a / 16036693/5563156 给了我这个主意。这些代码似乎可以完成工作

After hours messing around with the code, trial and error, tried different codes, nguyen's code and the code here https://stackoverflow.com/a/16036693/5563156 gives me the idea. these codes seems to get the job done

ListFragment.java

mRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
        @Override
        public boolean onInterceptTouchEvent(RecyclerView recyclerView, MotionEvent motionEvent) {
            View child = recyclerView.findChildViewUnder(motionEvent.getX(), motionEvent.getY());

            if (child != null && mGestureDetector.onTouchEvent(motionEvent)) {
                int position = recyclerView.getChildLayoutPosition(child);
                selectedItem = mItems.get(position);
                itemId = mItems.get(position).getId();
                //pass selected item's ID to Main Activity
                Intent i = new Intent(getActivity(), MainActivity.class);
                i.putExtra("selectedId", itemId);
                startActivity(i);
                Toast.makeText(getActivity(), "id = " + itemId, Toast.LENGTH_SHORT).show();

            }
            return false;
        }

MainActivity的OnCreate

if(savedInstanceState == null){
        //receives selected item's ID passed from ListFragment
        Intent intent = getIntent();
        long selId = intent.getLongExtra("selectedId", 0);

         if (selId > 0) {
             //send the selected item ID to ItemFragment
             Bundle bundle = new Bundle();
             bundle.putLong("selectedId", 0);
             ItemFragment frag = new ItemFragment();
         openFragment(ItemFragment.newInstance(selId), "Update Item");
         frag.setArguments(bundle);
         }}

ItemFragment.java

public static ItemFragment newInstance(long selId) {
    ItemFragment fragment = new ItemFragment();

    if (selId > 0) {
        Bundle bundle = new Bundle();
        bundle.putLong("selectedId", selId);
        fragment.setArguments(bundle);
    }
    return fragment;
}

ItemFragment的OnCreateView

Bundle args = getArguments();
    if (args != null && args.containsKey("selectedId")) {
        selId = args.getLong("selectedId");
    }

感谢发布代码的每个人!感谢帮助。

Thanks to everyone who posted their codes! Appreciate the help.

这篇关于Android:捆绑NullPointerException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆