Android 更改片段时提交已调用的错误
我最近在授予访问外部存储的权限(Android M)时遇到了错误“onSaveInstanceState之后无法执行此操作”。 我根据帖子(我想)解决了这个问题 现在我遇到了一个新的问题,当我试图更改一个片段时,出现了错误“commit ready called” 只要我想切换到某个片段(例如Discussionfragment),我就会得到错误“commit ready called”,请参阅logcat 我已经在stackoverflow上寻找了一些解决方案,但我似乎没有发现问题所在,我知道有很多问题需要解决,但在我的情况下如何处理呢? 有人能帮我吗 调用Discussionfragment:Android 更改片段时提交已调用的错误,android,android-fragments,fragmenttransaction,fragmentmanager,Android,Android Fragments,Fragmenttransaction,Fragmentmanager,我最近在授予访问外部存储的权限(Android M)时遇到了错误“onSaveInstanceState之后无法执行此操作”。 我根据帖子(我想)解决了这个问题 现在我遇到了一个新的问题,当我试图更改一个片段时,出现了错误“commit ready called” 只要我想切换到某个片段(例如Discussionfragment),我就会得到错误“commit ready called”,请参阅logcat 我已经在stackoverflow上寻找了一些解决方案,但我似乎没有发现问题所在,我知道
public class DiscussionsActivity extends BaseActivity
{
..
discussionsFragment = DiscussionsFragment.getInstance(id);
changeContent(discussionsFragment, R.id.content, false); <---
..
}
公共类讨论活动扩展了BaseActivity
{
..
discussionsFragment=discussionsFragment.getInstance(id);
changeContent(discussionsFragment,R.id.content,false);删除全局FragmentTransaction并在本地声明它
public void changeContent(Fragment fragment, int content, boolean inBackStack) {
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
try {
inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
} catch (Exception e) {
}
fragmentManager = getSupportFragmentManager();
String newTag = ((Object) fragment).getClass().getName() + ":" + fragmentManager.getBackStackEntryCount();
FragmentTransaction transaction = fragmentManager.beginTransaction().replace(content, fragment, newTag);
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
if (inBackStack) {
transaction.addToBackStack(fragment.getClass().getSimpleName());
} else
mReturningWithResult = true; <--- handle onSaveInstanceState error in onResume
try {
transaction.commit();
} catch (IllegalStateException ignored) {
// There's no way to avoid getting this if saveInstanceState has already been called.
}
currentFragment = fragment;
}
public void changeContent(片段片段、int内容、布尔inBackStack){
InputMethodManager InputMethodManager=(InputMethodManager)getSystemService(Activity.INPUT\u方法\u服务);
试一试{
inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),0);
}捕获(例外e){
}
fragmentManager=getSupportFragmentManager();
字符串newTag=((对象)fragment.getClass().getName()+“:”+fragmentManager.GetBackBackbackEntryCount();
FragmentTransaction=fragmentManager.beginTransaction().replace(内容、片段、新标记);
transaction.setTransition(FragmentTransaction.transition\u FRAGMENT\u OPEN);
if(内备份堆栈){
transaction.addToBackStack(fragment.getClass().getSimpleName());
}否则
mReturningWithResult=true;在commit语句之后,您可以尝试使用相同的片段事务提交两次。如果以前的事务已经提交,请创建一个新的片段事务
还建议确保commit()
使用调试点
public void changeContent(Fragment fragment, int content, boolean inBackStack) {
...........
...........
try {
fragmentManager.popBackStackImmediate();
transaction.commit();
} catch (IllegalStateException ignored) {
// There's no way to avoid getting this if saveInstanceState has already been called.
...........
...........
}
@Override
public void onResume() {
super.onResume();
...........
...........
//This method would be called at second time.
transaction.commit(); <---- HERE THE CRASH HAPPENS
// Reset the boolean flag back to false for next time.
mReturningWithResult = false;
...........
...........
}
public void changeContent(片段片段、int内容、布尔inBackStack){
...........
...........
试一试{
fragmentManager.popbackbackimmediate();
commit();
}捕获(IllegalStateException被忽略){
//如果已调用saveInstanceState,则无法避免出现这种情况。
...........
...........
}
@凌驾
恢复时公开作废(){
super.onResume();
...........
...........
//此方法将在第二次调用。
transaction.commit();每次您打算执行任何数量的碎片操作时,都需要开始一个新的碎片事务。但这就是我在changeContent中所做的。请您根据我的代码提供一个示例,它应该是什么?Thx Nas但问题在于onResume,其中包含什么?因为现在根本没有显示MainActivity。
public void changeContent(Fragment fragment, int content, boolean inBackStack) {
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
try {
inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
} catch (Exception e) {
}
fragmentManager = getSupportFragmentManager();
String newTag = ((Object) fragment).getClass().getName() + ":" + fragmentManager.getBackStackEntryCount();
FragmentTransaction transaction = fragmentManager.beginTransaction().replace(content, fragment, newTag);
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
if (inBackStack) {
transaction.addToBackStack(fragment.getClass().getSimpleName());
} else
mReturningWithResult = true; <--- handle onSaveInstanceState error in onResume
try {
transaction.commit();
} catch (IllegalStateException ignored) {
// There's no way to avoid getting this if saveInstanceState has already been called.
}
currentFragment = fragment;
}
public void changeContent(Fragment fragment, int content, boolean inBackStack) {
...........
...........
try {
fragmentManager.popBackStackImmediate();
transaction.commit();
} catch (IllegalStateException ignored) {
// There's no way to avoid getting this if saveInstanceState has already been called.
...........
...........
}
@Override
public void onResume() {
super.onResume();
...........
...........
//This method would be called at second time.
transaction.commit(); <---- HERE THE CRASH HAPPENS
// Reset the boolean flag back to false for next time.
mReturningWithResult = false;
...........
...........
}