java - 活动在 Fragment Transaction 上重置
问题描述
我有一个根据用户操作(按钮单击)或事件(触发 LocalBroadcast 的 FCM 数据消息)加载多个片段的活动。
最近,当我将 Fragment Transaction 放在 BroadcastReceiver 中时,我遇到了一个障碍,一旦接收器被触发,而不是加载下一个片段,我会得到第一个(默认)片段,该片段在活动的 OnCreate 中加载,暗示活动已以某种方式重置/重新启动。
考虑到这个速度,我在 Android Studio 重置 logcat 之前看到的唯一错误是:
java.lang.IllegalStateException:onSaveInstanceState 后无法执行此操作
除了我发现的关于 Activity State Loss 的这篇文章外,四处挖掘并没有多大帮助。它相当古老(2013),但似乎有道理。但是,除了让我的片段更复杂一点,并将下一个片段的逻辑交给这个片段本身之外,我没有想到任何解决方案。
请在下面找到发生这种情况的代码。
BroadcastReceiver assistanceReceivedStatusReceiver = new BroadcastReceiver() {
public void dummyfunc(){
return;
}
@Override
public void onReceive(Context context, Intent intent) {
// this is triggered by the localBroadcast from FCM Service
boolean requestresult = intent.getBooleanExtra("success", true);
if(!requestresult) {
// we don't have a responder
Log.d(TAG, "onReceive: =======================================");
Log.d(TAG, "onReceive: =======================================");
Log.d(TAG, "onReceive: UNABLE TO FIND A RESPONDER");
Log.d(TAG, "onReceive: =======================================");
Log.d(TAG, "onReceive: =======================================");
String message = "Unable to find you a responder, please try again!";
frameAnimation.stop();
txtRequestStatus.setText(message);
dialogButtonLayout.setVisibility(View.VISIBLE);
showBottomAppBar();
showMenuFab();
moveMenuRight();
setMenuImage(R.drawable.baseline_undo_white_24dp);
menuButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dialogLayout.setVisibility(View.GONE);
waitingLayout.setVisibility(View.VISIBLE);
moveMenuCenter();
resetMenuImage();
menuButton.setOnClickListener(defaultMenuButtonListener);
}
});
} else {
// we have a responder
// this is a one time receiver - set up an Observable for the Live<Incident>
// and unregister self.
Log.d(TAG, "onReceive: =======================================");
Log.d(TAG, "onReceive: =======================================");
Log.d(TAG, "onReceive: RECEIVED A RESPONDER");
Log.d(TAG, "onReceive: =======================================");
Log.d(TAG, "onReceive: =======================================");
inIncident = true;
Bundle nextbundle = new Bundle();
responderinfo = intent.getBundleExtra("responderinfo");
nextbundle.putParcelable("data", intent.getBundleExtra("data"));
nextbundle.putBundle("responderinfo", responderinfo);
// GO! GO! GO!!!
//startFragmentWithArgs(new RequestAssistFragmentDeliver(),nextbundle );
RequestAssistFragmentDeliver deliver = new RequestAssistFragmentDeliver();
deliver.setArguments(nextbundle);
((Reviv) getActivity()).getSupportFragmentManager()
.beginTransaction()
.replace(R.id.containerFrameLayout, deliver).commitAllowingStateLoss();
}
}
};
关于出了什么问题的任何想法?与往常一样,我很乐意根据需要分享更多信息(代码库非常庞大,知道需要什么有助于我分享相关部分)。
更新 1: 共享 Udit 要求的功能。这些是包装函数,有助于使代码更具可读性。bottomAppBar (BottomAppBar) 和 menuButton (FAB) 是加载在 Activity 中的视图,我通过调用 Activity 中定义的 getter 在每个 Fragment 中进行关联。
(MainActivity)getActivity.getBottomAppBar();
功能:
private void showBottomAppBar(){
bottomAppBar.setVisibility(View.VISIBLE);
menuButton.setVisibility(View.VISIBLE);
}
private void moveMenuRight(){
bottomAppBar.setFabAlignmentMode(BottomAppBar.FAB_ALIGNMENT_MODE_END);
}
private void showMenuFab(){
//bottomAppBar.setFabAttached(true);
menuButton.setVisibility(View.VISIBLE);
}
解决方案
据我所知,由于在添加片段 (java.lang.IllegalStateException) 时发生崩溃,您的活动正在重新启动。
要确认,您可以替换
.commit()
方法与
.commitAllowingStateLoss()
看看这是否能解决你的问题
推荐阅读
- javascript - 按内部数组对象中的键值对对象的外部数组进行排序
- r - 将 txt(对话)分成以演讲者姓名作为变量的列
- java - 从 Windows 批处理文件打开 IntelliJ 终端窗口
- kotlin - Kotlin/Native 如何使用只有头文件的 C/C++ 库
- node.js - 使用 node.js 和 MySQL 获取 ENOENT 错误
- c# - 如何修复数组和循环?
- java - 如何在 Minecraft 中制作一个面向玩家面向的方块?
- c - 带有 Char ** 的 printf 的编译器警告(作为字符串数组)
- python - Python - 如何通过 id 合并到 df 并获取 NaN 值
- ubuntu - 如何修复这个 pip3 错误?