简体   繁体   English

通过单击按钮替换片段时,应用程序崩溃

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM