碎片事务上的活动重置



我有一个活动,它根据用户操作(按钮单击(或事件(触发LocalBroadcast的FCM数据消息(加载多个片段。

最近,当我在BroadcastReceiver中放入Fragment Transaction时,我遇到了一个障碍,一旦接收器被触发,我就得到了第一个(默认(片段,它加载在活动的OnCreate中,这意味着活动已经以某种方式重置/重新启动。

考虑到这个速度,在安卓工作室重置logcat之前,我看到的唯一错误是:

java.lang.IollegalStateException:之后无法执行此操作onSaveInstanceState

除了我发现的这篇关于活动状态丢失的文章外,四处挖掘并没有多大帮助。它相当古老(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(是在活动中加载的视图,我通过调用活动中定义的getter在每个片段中建立关联。

(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()

看看这是否能解决你的问题

最新更新