方向改变时片段成分为空

时间:2018-07-08 21:33:42

标签: android android-fragments

我的游戏配置文件活动收到一个传入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)'   参考

1 个答案:

答案 0 :(得分:1)

Android框架会销毁该片段,并默认在配置更改时重新创建该片段。如果您自己没有处理配置更改,那么您的片段已被重新创建。对片段的引用

mGameInfoFragment.setGameInfo(game);

可能不再有效,因此NullPointerException。根据经验,请勿存储对具有生命周期的对象的引用(例如活动和片段),因为它们易失,并且可能导致内存泄漏(您是内存泄漏的一个示例,系统无法释放您的旧片段,因为您仍然有引用)。

一种方法是自己处理方向改变。进一步阅读here

android:configChanges="orientation"

另一种方法是确保在调用方法之前始终获取框架放大并显示的片段。