[英]App crashes when replacing fragments by button click
I have to replace one fragment with another, I wrote usual code to do so but I have crash. 我必须将一个片段替换为另一个片段,我这样做是为了编写普通代码,但我崩溃了。
My code to replace fragments: 我的代码替换片段:
button1.setOnClickListener {
supportFragmentManager.beginTransaction()
.replace(R.id.content_frame, SecondFragment())
.commit()
}
button2.setOnClickListener {
supportFragmentManager.beginTransaction()
.replace(R.id.content_frame, FirstFragment())
.commit()
}
Here is my crash: 这是我的崩溃:
Process: ru.aspirity.stolbyapp.dev, PID: 28475
java.lang.ArrayIndexOutOfBoundsException: length=12; index=-1
at android.view.ViewGroup.getAndVerifyPreorderedView(ViewGroup.java:3554)
at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:6905)
at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:6907)
at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:6907)
at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:6907)
at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:6907)
at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:6907)
at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:6907)
at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:6907)
at com.android.internal.policy.DecorView.gatherTransparentRegion(DecorView.java:301)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2225)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1392)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6752)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911)
at android.view.Choreographer.doCallbacks(Choreographer.java:723)
at android.view.Choreographer.doFrame(Choreographer.java:658)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
I also have tried to make add instead of replace, it worked but not correctly for me. 我也曾尝试使添加而不是替换,它起作用但对我来说不正确。
Try something like this: 尝试这样的事情:
In your button clicks: 在您的按钮中单击:
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
replaceFragment(new SecondFragment());
}
});
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
replaceFragment(new FirstFragment());
}
});
// Method to push fragment and maintaining backstack //推入片段并维护堆栈的方法
public void replaceFragment(Fragment fragment) {
String backStateName = fragment.getClass().getName();
FragmentManager manager = getSupportFragmentManager();
boolean fragmentPopped = manager.popBackStackImmediate(backStateName, 0);
if (!fragmentPopped && manager.findFragmentByTag(backStateName) == null) {
//if fragment not in back stack, create it.
FragmentTransaction ft = manager.beginTransaction();
ft.replace(R.id.frame_container, fragment, backStateName);
ft.addToBackStack(backStateName);
ft.commit();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.