"犯已经称为QUOT;错误在Android的碎片addToBackStack [英] "commit already called" error in android addToBackStack for fragment
问题描述
我创造了一个家庭的活动,其中包括一个导航抽屉的onclick与片段。我已经包括 fragmentTransaction.addToBackStack(空).commit();
的片段交易code回去previous页面。
我要的要求是 NavigationDrawer - >片段1 - > Fragment2 - >在后退按钮preSS - >片段1(上后退按钮pressed) - 方式> MainActivity
不过,现在我只能移动到片段1
,但不能移动到 Fragment2
。
它显示了一个错误 java.lang.IllegalStateException:已提交名为
在我的MainActivity
@燮pressWarnings(StatementWithEmptyBody)
@覆盖
公共布尔onNavigationItemSelected(菜单项项){
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
//处理导航视图项点击这里。
INT ID = item.getItemId();
RelativeLayout的mainLayout =(RelativeLayout的)findViewById(R.id.mainlayout); 如果(ID == R.id.nav_project){
ProjectFragment片段=新ProjectFragment();
mainLayout.removeAllViews();
fragmentTransaction.add(R.id.mainlayout,片段);
fragmentTransaction.addToBackStack(空).commit(); } DrawerLayout抽屉=(DrawerLayout)findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
返回true;
}
@覆盖
公共无效onBack pressed(){
DrawerLayout抽屉=(DrawerLayout)findViewById(R.id.drawer_layout);
如果(drawer.isDrawerOpen(GravityCompat.START)){
drawer.closeDrawer(GravityCompat.START);
}其他{
super.onBack pressed();
}
}
我的第一块碎片
进口android.os.Bundle;
进口android.support.annotation.Nullable;
进口android.support.v4.app.Fragment;
进口android.support.v4.app.FragmentManager;
进口android.support.v4.app.FragmentTransaction;
进口android.view.LayoutInflater;
进口android.view.View;
进口android.view.ViewGroup;
进口android.widget.Button;
进口android.widget.ImageView;
进口android.widget.RelativeLayout;
/ **
*一个简单的{@link片段}子类。
* /
公共类LoginFragment扩展片段{
按钮登入,登录;
ImageView的标志; @Nullable
@覆盖
公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,捆绑savedInstanceState){
视图V = inflater.inflate(R.layout.fragment_login,集装箱,FALSE);
FragmentManager fragmentManager = getFragmentManager();
最后FragmentTransaction fragmentTransaction =
fragmentManager.beginTransaction();
最终的RelativeLayout mainLayout =(RelativeLayout的)getActivity()findViewById(R.id.mainlayout)。
登入=(按钮)v.findViewById(R.id.button2); signin.setOnClickListener(新View.OnClickListener(){
@覆盖
公共无效的onClick(视图v){
SignUpFragment片段=新SignUpFragment();
mainLayout.removeAllViews();
fragmentTransaction.add(R.id.mainlayout,片段);
fragmentTransaction.commit();
fragmentTransaction.addToBackStack(空).commit();
}
});
登录=(按钮)v.findViewById(R.id.button);
login.setOnClickListener(新View.OnClickListener(){
@覆盖
公共无效的onClick(视图v){
LoginEnterFragment片段=新LoginEnterFragment();
mainLayout.removeAllViews();
fragmentTransaction.add(R.id.mainlayout,片段);
fragmentTransaction.commit();
fragmentTransaction.addToBackStack(空).commit();
}
});
LOGO =(ImageView的)v.findViewById(R.id.imageView); 返回伏;
}}
我的第三个片段
进口android.os.Bundle;
进口android.support.v4.app.Fragment;
进口android.view.LayoutInflater;
进口android.view.View;
进口android.view.ViewGroup;/ **
*一个简单的{@link片段}子类。
* /
公共类LoginEnterFragment扩展片段{ 公共LoginEnterFragment(){
//必需的空公共构造
}
@覆盖
公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,
捆绑savedInstanceState){
//充气的布局该片段
返回inflater.inflate(R.layout.fragment_login_enter,集装箱,FALSE);
}
}
我的logcat
11-01 23:44:17.237 676-676 / com.example.rubin E / AndroidRuntime:致命异常:主要
11-01 23:44:17.237 676-676 / com.example.rubin E / AndroidRuntime:工艺:com.example.rubin,PID:676
11-01 23:44:17.237 676-676 / com.example.rubin E / AndroidRuntime:java.lang.IllegalStateException:提交已经叫
11-01 23:44:17.237 676-676 / com.example.rubin E / AndroidRuntime:在android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:621)
11-01 23:44:17.237 676-676 / com.example.rubin E / AndroidRuntime:在android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:613)
11-01 23:44:17.237 676-676 / com.example.rubin E / AndroidRuntime:在com.example.root5solutions.mirrealtors.LoginFragment $ 2.onClick(LoginFragment.java:53)
11-01 23:44:17.237 676-676 / com.example.rubin E / AndroidRuntime:在android.view.View.performClick(View.java:4780)
11-01 23:44:17.237 676-676 / com.example.rubin E / AndroidRuntime:在android.view.View $ PerformClick.run(View.java:19866)
11-01 23:44:17.237 676-676 / com.example.rubin E / AndroidRuntime:在android.os.Handler.handleCallback(Handler.java:739)
11-01 23:44:17.237 676-676 / com.example.rubin E / AndroidRuntime:在android.os.Handler.dispatchMessage(Handler.java:95)
11-01 23:44:17.237 676-676 / com.example.rubin E / AndroidRuntime:在android.os.Looper.loop(Looper.java:135)
11-01 23:44:17.237 676-676 / com.example.rubin E / AndroidRuntime:在android.app.ActivityThread.main(ActivityThread.java:5254)
11-01 23:44:17.237 676-676 / com.example.rubin E / AndroidRuntime:在java.lang.reflect.Method.invoke(本机方法)
11-01 23:44:17.237 676-676 / com.example.rubin E / AndroidRuntime:在java.lang.reflect.Method.invoke(Method.java:372)
11-01 23:44:17.237 676-676 / com.example.rubin E / AndroidRuntime:在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:903)
11-01 23:44:17.237 676-676 / com.example.rubin E / AndroidRuntime:在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
IllegalStateException异常:已提交名为
块引用>由于调用
提交()
方法二时间LoginFragment
在登入片断code>和
登录
按钮点击:fragmentTransaction.commit();
fragmentTransaction.addToBackStack(空).commit();线引起的问题。
使用
addToBackStack
方法:fragmentTransaction.addToBackStack(空).commit();
I had Created a Home activity which includes a Navigation Drawer onclick with fragment. I had included
fragmentTransaction.addToBackStack(null).commit();
with the fragment transaction code to go back to previous page.My Desired requirement was
NavigationDrawer-->Fragment1-->Fragment2--> On BackButtonPress-->Fragment1(On BackButton Pressed)-->MainActivity.
But,Now i am only able to move to
Fragment1
,But cant move toFragment2
. It shows an errorjava.lang.IllegalStateException: commit already called
In My MainActivity
@SuppressWarnings("StatementWithEmptyBody") @Override public boolean onNavigationItemSelected(MenuItem item) { FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); // Handle navigation view item clicks here. int id = item.getItemId(); RelativeLayout mainLayout=(RelativeLayout)findViewById(R.id.mainlayout); if (id == R.id.nav_project) { ProjectFragment fragment = new ProjectFragment(); mainLayout.removeAllViews(); fragmentTransaction.add(R.id.mainlayout, fragment); fragmentTransaction.addToBackStack(null).commit(); } DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); drawer.closeDrawer(GravityCompat.START); return true; } @Override public void onBackPressed() { DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); if (drawer.isDrawerOpen(GravityCompat.START)) { drawer.closeDrawer(GravityCompat.START); } else { super.onBackPressed(); } }
My First Fragment
import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.ImageView; import android.widget.RelativeLayout; /** * A simple {@link Fragment} subclass. */ public class LoginFragment extends Fragment { Button signin,login; ImageView logo; @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_login,container,false); FragmentManager fragmentManager = getFragmentManager(); final FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); final RelativeLayout mainLayout=(RelativeLayout)getActivity().findViewById(R.id.mainlayout); signin=(Button)v.findViewById(R.id.button2); signin.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { SignUpFragment fragment = new SignUpFragment(); mainLayout.removeAllViews(); fragmentTransaction.add(R.id.mainlayout, fragment); fragmentTransaction.commit(); fragmentTransaction.addToBackStack(null).commit(); } }); login=(Button)v.findViewById(R.id.button); login.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { LoginEnterFragment fragment = new LoginEnterFragment(); mainLayout.removeAllViews(); fragmentTransaction.add(R.id.mainlayout, fragment); fragmentTransaction.commit(); fragmentTransaction.addToBackStack(null).commit(); } }); logo=(ImageView)v.findViewById(R.id.imageView); return v; } }
My third Fragment
import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; /** * A simple {@link Fragment} subclass. */ public class LoginEnterFragment extends Fragment { public LoginEnterFragment() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment return inflater.inflate(R.layout.fragment_login_enter, container, false); } }
My Logcat
11-01 23:44:17.237 676-676/com.example.rubin E/AndroidRuntime: FATAL EXCEPTION: main 11-01 23:44:17.237 676-676/com.example.rubin E/AndroidRuntime: Process: com.example.rubin, PID: 676 11-01 23:44:17.237 676-676/com.example.rubin E/AndroidRuntime: java.lang.IllegalStateException: commit already called 11-01 23:44:17.237 676-676/com.example.rubin E/AndroidRuntime: at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:621) 11-01 23:44:17.237 676-676/com.example.rubin E/AndroidRuntime: at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:613) 11-01 23:44:17.237 676-676/com.example.rubin E/AndroidRuntime: at com.example.root5solutions.mirrealtors.LoginFragment$2.onClick(LoginFragment.java:53) 11-01 23:44:17.237 676-676/com.example.rubin E/AndroidRuntime: at android.view.View.performClick(View.java:4780) 11-01 23:44:17.237 676-676/com.example.rubin E/AndroidRuntime: at android.view.View$PerformClick.run(View.java:19866) 11-01 23:44:17.237 676-676/com.example.rubin E/AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:739) 11-01 23:44:17.237 676-676/com.example.rubin E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:95) 11-01 23:44:17.237 676-676/com.example.rubin E/AndroidRuntime: at android.os.Looper.loop(Looper.java:135) 11-01 23:44:17.237 676-676/com.example.rubin E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5254) 11-01 23:44:17.237 676-676/com.example.rubin E/AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method) 11-01 23:44:17.237 676-676/com.example.rubin E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:372) 11-01 23:44:17.237 676-676/com.example.rubin E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 11-01 23:44:17.237 676-676/com.example.rubin E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
解决方案IllegalStateException: commit already called
Because calling
commit()
method two time inLoginFragment
Fragment onsignin
andlogin
Button click :fragmentTransaction.commit(); fragmentTransaction.addToBackStack(null).commit();
lines causing issue.
Use
addToBackStack
method as:fragmentTransaction.addToBackStack(null).commit();
这篇关于"犯已经称为QUOT;错误在Android的碎片addToBackStack的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!