我遇到了一个问题,开始让我头疼。
我的应用程序基本上是带有导航抽屉的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回答帮助我找到了问题,因此我认为这是正确的答案。
答案 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查询对象。