有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

安卓试图调用虚拟方法java。util。在片段中使用Bundle的ArrayList

您好,我正在尝试将ArrayList抛出捆绑包发送到Fragment,我遇到了这个问题(问题是在获取ArrayList时引起的),并且我在发送之前已经测试过它不为null, 我已随信寄去了

arg.putStringArrayList("lp", li);

并随信接受

ArrayList<String> lil = getArguments().getStringArrayList("lp");

这是StackTrace:

04-18 20:43:55.153  17577-17577/com.pfe.elmokhtar.domotique W/System.err﹕ java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.ArrayList 安卓.os.Bundle.getStringArrayList(java.lang.String)' on a null object reference
04-18 20:43:55.153  17577-17577/com.pfe.elmokhtar.domotique W/System.err﹕ at com.pfe.elmokhtar.domotique.DetailFragment.onCreateView(DetailFragment.java:31)
04-18 20:43:55.158  17577-17577/com.pfe.elmokhtar.domotique W/System.err﹕ at 安卓.app.Fragment.performCreateView(Fragment.java:2053)
04-18 20:43:55.158  17577-17577/com.pfe.elmokhtar.domotique W/System.err﹕ at 安卓.app.FragmentManagerImpl.moveToState(FragmentManager.java:894)
04-18 20:43:55.158  17577-17577/com.pfe.elmokhtar.domotique W/System.err﹕ at 安卓.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
04-18 20:43:55.158  17577-17577/com.pfe.elmokhtar.domotique W/System.err﹕ at 安卓.app.BackStackRecord.run(BackStackRecord.java:833)
04-18 20:43:55.158  17577-17577/com.pfe.elmokhtar.domotique W/System.err﹕ at 安卓.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1452)
04-18 20:43:55.160  17577-17577/com.pfe.elmokhtar.domotique W/System.err﹕ at 安卓.app.FragmentManagerImpl$1.run(FragmentManager.java:447)
04-18 20:43:55.160  17577-17577/com.pfe.elmokhtar.domotique W/System.err﹕ at 安卓.os.Handler.handleCallback(Handler.java:739)
04-18 20:43:55.160  17577-17577/com.pfe.elmokhtar.domotique W/System.err﹕ at 安卓.os.Handler.dispatchMessage(Handler.java:95)
04-18 20:43:55.160  17577-17577/com.pfe.elmokhtar.domotique W/System.err﹕ at 安卓.os.Looper.loop(Looper.java:135)
04-18 20:43:55.160  17577-17577/com.pfe.elmokhtar.domotique W/System.err﹕ at 安卓.app.ActivityThread.main(ActivityThread.java:5254)
04-18 20:43:55.160  17577-17577/com.pfe.elmokhtar.domotique W/System.err﹕ at java.lang.reflect.Method.invoke(Native Method)
04-18 20:43:55.160  17577-17577/com.pfe.elmokhtar.domotique W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:372)
04-18 20:43:55.160  17577-17577/com.pfe.elmokhtar.domotique W/System.err﹕ at com.安卓.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898)
04-18 20:43:55.160  17577-17577/com.pfe.elmokhtar.domotique W/System.err﹕ at com.安卓.internal.os.ZygoteInit.main(ZygoteInit.java:693)

这就是我如何引用片段的方式

public void onItemClick(AdapterView<?> arg0, View v, int position, long id) {
            dLayout.closeDrawers();
            Bundle arg = new Bundle();
            arg.putString("Menu", menu[position]);
            Fragment detail = new DetailFragment();
            FragmentManager fragmentManager = getFragmentManager();
            fragmentManager.beginTransaction().replace(R.id.content_frame, detail).commit();
            if (position == 0) {
            /*
            Pieces
             */
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                invokeWS();  //WebService Invocation it run fine

                arg.putStringArrayList("lp", li);
                if(li.isEmpty())
                    System.out.println("null Catched !");
            }
                /*
            Pieces
             */


            if (position == 5) {

                Intent intent = new Intent(Home.this, CheckLoginActivity.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(intent);

            }

        }
    });

这是类detailfragment

package com.pfe.elmokhtar.domotique;

/**
 * Created by elmokhtar on 3/11/15.
 */

import 安卓.app.Fragment;
import 安卓.os.Bundle;
import 安卓.view.LayoutInflater;
import 安卓.view.View;
import 安卓.view.ViewGroup;
import 安卓.widget.ArrayAdapter;
import 安卓.widget.ListView;
import 安卓.widget.TextView;

import java.util.ArrayList;


public class DetailFragment extends Fragment {


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle args) {
        View view = inflater.inflate(R.layout.detailfragment, container, false);
        //        TextView text= (TextView) view.findViewById(R.id.detail);
        ListView list = (ListView) view.findViewById(R.id.list);
        Bundle test = getArguments();
        //        String menu = getArguments().getString("Menu");
        try {

            ArrayList < String > lil = test.getStringArrayList("lp");
            System.out.println("done!");


            ArrayAdapter < String > adapter;
            adapter = new ArrayAdapter < String > (this.getActivity(), 安卓.R.layout.simple_list_item_1, lil);
            list.setAdapter(adapter);
        } catch (Exception e) {
            e.printStackTrace();
        }
        //text.setText("test");
        return view;
    }
}

共 (3) 个答案

  1. # 1 楼答案

    按照我在评论中的建议,将参数传递给片段:

    public void onItemClick(AdapterView <? > arg0, View v, int position, long id) {
        dLayout.closeDrawers();
        Bundle arg = new Bundle();
        arg.putString("Menu", menu[position]);
        arg.putStringArrayList("lp", li);
        Fragment detail = new DetailFragment();
        detail.setArguments(arg);
        FragmentManager fragmentManager = getFragmentManager();
        fragmentManager.beginTransaction().replace(R.id.content_frame, detail).commit();
        //...
    }
    
  2. # 2 楼答案

    Fragment detail = new DetailFragment();
    Bundle arg = new Bundle();
    arg.putStringArrayList("lp", li);
    detail.setArguments(arg);
    FragmentManager fragmentManager = getFragmentManager();
    fragmentManager.beginTransaction().replace(R.id.content_frame, detail).commit();
    
  3. # 3 楼答案

    创建片段实例并向其传递值的首选方法

    活动:像这样创建片段实例

    Fragment detail=DetailFragment.newInstace(li);
    fragmentManager.beginTransaction().replace(R.id.content_frame, detail).commit();
    

    片段:始终为片段创建一个默认构造函数

    All subclasses of Fragment must include a public no-argument constructor.

     public class DetailFragment extends Fragment {
    
            public DetailFragment() {
            }
    
            public static Fragment newInstace(ArrayList<String> items) {
                Fragment fragment = new DetailFragment();
                Bundle bundle = new Bundle();
                bundle.putStringArrayList("key", items);
                fragment.setArguments(bundle);
                return fragment;
            }
    
            //your stuff
    
        }