当应用程序来自后台时,Android片段崩溃

时间:2013-12-30 10:09:17

标签: android android-fragments nullpointerexception

我遇到了一个问题,开始让我头疼。

我的应用程序基本上是带有导航抽屉的FragmentActivity,导航抽屉的每个按钮都会加载一个新片段。 我正在为项目中的几乎每个组件使用android.support.v4。

我的问题在于,每当我的应用程序转到后台并返回到前台时,oncreate视图会再次加载视图,而我用来创建视图的大多数变量都为null,因此我的应用程序崩溃。

有人能指出我正确的方向来解决这个问题吗?是因为OnsavedInstanceState()方法,onCreateView()做变量实例化,还是其他什么?

这是我的错误日志:

    java.lang.RuntimeException: Unable to start activity ComponentInfo{pt.gema.welcomeangola/pt.gema.welcomeangola.activities.MainActivity}: java.lang.NullPointerException
    Caused by: java.lang.NullPointerException
    at java.util.ArrayList.<init>(ArrayList.java:93)
    at pt.gema.welcomeangola.activities.ListViewExampleFragment.onCreateView(ListViewExampleFragment.java:103)

我的一个片段OnCreateView()代码

    @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
        lvef = this;

        View rootView = inflater.inflate(R.layout.activity_items_list, container, false);
        getActivity().setTitle("ListViewExample");
        btnSearch = (ToggleButton) rootView.findViewById(R.id.btn_search);
        btnSearchText = (ImageButton) rootView.findViewById(R.id.btn_search_string);
        btnAZ = (ToggleButton) rootView.findViewById(R.id.btn_az);
        searchText = (EditText) rootView.findViewById(R.id.search_text);

        layoutSearch = (RelativeLayout) rootView.findViewById(R.id.search_layout);

        pBar = (RelativeLayout) rootView.findViewById(R.id.progress_bar_layout);

        List<Integer> filter= new ArrayList<Integer>();
        filter.add(id_type);

        OriginalObjectsLocality= new ArrayList<ListPlaceInfo>(Objects);
        listview = (ListView) rootView.findViewById(R.id.list_item);

        adapter = new WAListAdapter(getActivity().getApplicationContext(),Objects,OriginalObjectsLocality,lvef);

        listview.setAdapter(adapter);
    return rootView;
}

EDIT 虽然问题不仅出现在Arraylist对象中,还有我尝试访问的另一个类的实例化。 laalto回答帮助我找到了问题,因此我认为这是正确的答案。

1 个答案:

答案 0 :(得分:1)

来自评论:

  

@Szymon我在片段构造函数中收到了那个arraylist,而我知道我的问题在这里... public ListViewExampleFragment(ArrayList objects){super(); this.Objects = objects; this.listPlaceAZ = azListing(new ArrayList(objects)); }

在构造函数中设置成员变量Objects,该构造函数采用arraylist参数。

片段必须具有无参数构造函数,框架将创建调用该空构造函数的片段。因此,您的参数获取构造函数未被调用,Objects被留下null,从而导致NPE:

OriginalObjectsLocality= new ArrayList<ListPlaceInfo>(Objects);

如果您需要将参数传递给您的片段,请使用Bundle设置setArguments()并使用getArguments()访问。

  

但是将一个arraylist作为Bundle传递需要一个Parceble并且这需要我几乎改变所有代码,还有其他选择吗?

可以制作成员变量static,以便它可以在片段重建中幸存下来。但我不会推荐因为它会产生一整套其他问题,例如由于无法收集的对象导致的内存泄漏。

最好重新考虑设计。例如,您可能不需要传递一组对象。您只需将标识符数组作为参数传递,并在需要时按ID查询对象。