代码之家  ›  专栏  ›  技术社区  ›  Dima Bokov

尝试将数据从活动传递到片段时发生NullException

  •  0
  • Dima Bokov  · 技术社区  · 6 年前

    活动中的代码是:

    private String s=" ";
        @Override
        public void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_profile);
            Log.d(TAG, "onCreate: started.");
    
            ProfileUserName = (TextView) findViewById(R.id.display_name);
    
            test();
            ViewPostFragment fragment = ViewPostFragment.newInstance("Your value");
        }
     private void test()
        {
            ViewPostFragment mFragment=new ViewPostFragment();
                                    Bundle args=new Bundle();
                                    args.putString("PostKeyS" , s);
                                    mFragment.setArguments(args);
        }
    

    在片段中,我的代码是:

     @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState)
        {
    
            View view=inflater.inflate(R.layout.fragment_view_post,container,false);
    
    
            mBackArrow=(ImageView) view.findViewById(R.id.backArrow);
    
    
    
            String value = getArguments().getString("PosKeyS");
            Toast.makeText(getActivity(), "TThe code is the same?" + value, Toast.LENGTH_SHORT).show();
            return view;
    
        }
    public static ViewPostFragment newInstance(String s) {
            ViewPostFragment fragment = new ViewPostFragment();
            Bundle args = new Bundle();
            args.putString("PostKeyS", s);
            fragment.setArguments(args);
            return fragment;
        }
    

    致命异常:主 流程:com.example.android系统.bluesky,PID:22380 java.lang.RuntimeException:无法启动活动组件信息{com.example.android系统蓝调/com.example.android系统.bluesky.Profile.Profile活动}: java.lang.NullPointerException:尝试调用虚拟方法'java.lang.Stringandroid.os.Bundle.获取字符串(java.lang.String)'在空对象引用上 在android.app.ActivityThread.手足活动(ActivityThread.java:2466) 在android.app.ActivityThread.使用权$1200(ActivityThread.java:152) 在android.os.Handler.调度消息(Handler.java:102) 在android.os.Looper.循环(Looper.java:135) 在java.lang.reflect.方法调用(本地方法) 在com.android.internal网站.颧骨弓$MethodAndArgsCaller.run(合子网.java:958) 在com.android.internal网站.合子体.main(合子网.java:753) 在com.example.android系统.bluesky.ViewPostFragment.onCreateView(ViewPostFragment.java:91) 在安卓支持.v4。app.FragmentManagerImpl.moveToState(FragmentManager.java:1428) 在安卓支持.v4。app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1759) 在安卓支持.v4。app.BackStackRecord.executeOps(BackStackRecord.java:797) 在安卓支持.v4。app.FragmentManagerImpl.executeOps(FragmentManager.java:2596) 在安卓支持.v4。app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2383) 在安卓支持.v4。app.FragmentManagerImpl.remove操作和执行(FragmentManager.java:2338) 在安卓支持.v4。app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2245) 在安卓支持.v4。app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:3200) 在安卓支持.v4。app.FragmentActivity.onStart应用程序(碎片活动.java:597) 在安卓支持.v7版。app.AppCompatActivity.onStart应用程序(AppCompatActivity.java:177) 在android.app.Instrumentation公司.callActivityOnStart(仪器.java:1224) 在android.app.ActivityThread执行启动活动(ActivityThread.java:2369) 在android.app.ActivityThread.手足活动(ActivityThread.java:2466) 在android.app.ActivityThread.使用权$1200(ActivityThread.java:152) 在android.os.Looper.循环(Looper.java:135) 在android.app.ActivityThread.主(ActivityThread.java:5538) 在java.lang.reflect.方法调用(本地方法) 在java.lang.reflect.方法调用(方法.java:372) 在com.android.internal网站.颧骨弓$MethodAndArgsCaller.run(合子网.java:958) 在com.android.internal网站.合子体.main(合子网.java:753)

    有什么想法吗?

    2 回复  |  直到 6 年前
        1
  •  0
  •   Bayar Şahintekin    6 年前

    您应该为此使用newInstance方法

    首先,必须在片段中添加此方法

    public static ViewPostFragment newInstance(String s) {
        ViewPostFragment fragment = new ViewPostFragment();
        Bundle args = new Bundle();
        args.putString("PostKeyS", s);
        fragment.setArguments(args);
        return fragment;
    }
    

    ViewPostFragment fragment = ViewPostFragment.newInstance("Your value");
    

    最后,您可以像这样在片段中获取数据

    String value = getArguments().getString("PosKeyS");
    
        2
  •  0
  •   Joaquim Ley    6 年前

    我让你把剩下的 ViewPostFragment

    从提供的上下文与您传递数据的方式没有直接关系。

    正如你所说,你正试图 Toast onCreateView() 方法。

    onViewCreated() 相反 (这也取决于什么 Fragment 您的片段从支持版本或(不推荐使用的)框架扩展的超类。

    我还建议您阅读这些3分钟的文章,以帮助您理清传递数据的方式: