我的游戏配置文件活动收到一个传入ID的意图,然后我从我的Firebase数据库中请求具有ID的游戏,只有找到游戏后,我才会在片段中设置其信息。
这是我请求然后将_Game对象传递给我的片段的方式(为简洁起见,省略了代码,通常我添加了所有ChildEventListener方法)
public void findGameById(final int id) {
mGamesRef.orderByChild("id")
.equalTo(id)
.limitToFirst(1)
.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
_Game game = dataSnapshot.getValue(_Game.class);
mGameInfoFragment.setGameInfo(game);
}
});
}
当然,作为参数传递的id是从意图中获得的id。在活动的OnCreate中调用findGameById(int id)
我的GameInfoFragment
所在的setGameInfo(_Game game)
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_game_info, container, false);
String dateFormat = SharedPrefManager.read(SharedPrefManager.KEY_PREF_REGION, getString(R.string.default_date_format));
mDateFormatter = new SimpleDateFormat(dateFormat);
mTodayTimeMillis = Calendar.getInstance().getTimeInMillis();
return view;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
// Summary UI
mTextSummary = view.findViewById(R.id.summary);
mReadMore = view.findViewById(R.id.read_more);
mSummaryLoading = view.findViewById(R.id.summary_loading);
}
public void setGameInfo(_Game game) {
// Stop/hide all ongoing progress bars (loading)
mSummaryLoading.setVisibility(View.GONE);
}
在我改变方向之前一切都很好,因为然后在改变方向时会出现以下错误:
java.lang.NullPointerException:尝试调用虚拟方法'void 空对象上的android.widget.ProgressBar.setVisibility(int)' 参考
答案 0 :(得分:1)
Android框架会销毁该片段,并默认在配置更改时重新创建该片段。如果您自己没有处理配置更改,那么您的片段已被重新创建。对片段的引用
mGameInfoFragment.setGameInfo(game);
可能不再有效,因此NullPointerException。根据经验,请勿存储对具有生命周期的对象的引用(例如活动和片段),因为它们易失,并且可能导致内存泄漏(您是内存泄漏的一个示例,系统无法释放您的旧片段,因为您仍然有引用)。
一种方法是自己处理方向改变。进一步阅读here
android:configChanges="orientation"
另一种方法是确保在调用方法之前始终获取框架放大并显示的片段。