android - 使用TabLayout和ViewPager时,应用程序在选项卡2的后退按钮上崩溃

标签 android android-fragments crash android-viewpager tabview

我有一个名为“管理规则”的片段,我正在为TabLayout的每个项目使用TabLayout和ViewPager。每个寻呼机上都有2个按钮。当我单击Tab2中的按钮时,它调用了一个新片段,然后我按回去,它崩溃了。我不知道如何解决此问题,因为当我按回去时,Tab1中的相同按钮起作用。

Screenshoot of Manage Rules Fragment

我的管理规则片段代码:

public class ManageRule extends BaseFragment {

public ManageRule() {
    // Required empty public constructor
}

TabLayout tabLayout;
ViewPager viewPager;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View viewFragment = inflater.inflate(R.layout.fragment_manage_rule, container, false);

    viewPager = (ViewPager) viewFragment.findViewById(R.id.viewPager);

    tabLayout = (TabLayout) viewFragment.findViewById(R.id.tabLayout);

    viewPager.setAdapter(new CustomAdapter(getChildFragmentManager(), getContext()));
    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));

    //        tabLayout.setupWithViewPager(viewPager);
    tabLayout.post(new Runnable() {
        @Override
        public void run() {
            tabLayout.setupWithViewPager(viewPager);
        }
    });

    tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            viewPager.setCurrentItem(tab.getPosition());
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {
            viewPager.setCurrentItem(tab.getPosition());
        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {
            viewPager.setCurrentItem(tab.getPosition());
        }
    });

    if (ViewCompat.isLaidOut(tabLayout)) {
        tabLayout.setupWithViewPager(viewPager);
    } else {
        tabLayout.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
            @Override
            public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
                tabLayout.setupWithViewPager(viewPager);
                tabLayout.removeOnLayoutChangeListener(this);
            }
        });
    }


    return viewFragment;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

}


//TabLayout and ViewPager class
private class CustomAdapter extends FragmentPagerAdapter {

    private String fragments[] = {"Assign Rules", "Manage Rules"};

    public CustomAdapter(FragmentManager fragmentManager, Context context) {
        super(fragmentManager);
    }

    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0:
                return new AssignEventToBeacon();
            case 1:
                //return new ManageEventAssigned();
                return new ManageEventAssigned();
            default:
                return null;
        }
    }

    @Override
    public int getCount() {
        return fragments.length;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return fragments[position];
    }

}

}

我的错误日志。我在这里粘贴:http://pastebin.com/gty3e2ts

01-09 12:32:35.139 11642-11642/victory1908.nlbstafflogin2 E/InputEventSender: Exception dispatching finished signal. 01-09 12:32:35.139 11642-11642/victory1908.nlbstafflogin2 E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback 01-09 12:32:35.149 11642-11642/victory1908.nlbstafflogin2 E/MessageQueue-JNI: java.lang.IndexOutOfBoundsException: Invalid index 1, size is 0 at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) at java.util.ArrayList.get(ArrayList.java:308) at android.support.design.widget.TabLayout.getTabAt(TabLayout.java:448) at android.support.design.widget.TabLayout$TabLayoutOnPageChangeListener.onPageSelected(TabLayout.java:1759) at android.support.v4.view.ViewPager.dispatchOnPageSelected(ViewPager.java:1794) at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:548) at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:514) at android.support.v4.view.ViewPager.onRestoreInstanceState(ViewPager.java:1320) at android.view.View.dispatchRestoreInstanceState(View.java:14831) at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3183) at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3189) at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3189) at android.view.View.restoreHierarchyState(View.java:14809) at android.support.v4.app.Fragment.restoreViewState(Fragment.java:468) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1094) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248) at android.support.v4.app.BackStackRecord.popFromBackStack(BackStackRecord.java:958) at android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1666) at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:586) at android.support.v4.app.FragmentActivity.onBackPressed(FragmentActivity.java:169) at victory1908.nlbstafflogin2.MainActivity.onBackPressed(MainActivity.java:132) at android.app.Activity.onKeyUp(Activity.java:2576) at android.view.KeyEvent.dispatch(KeyEvent.java:3171) at android.app.Activity.dispatchKeyEvent(Activity.java:2831) at android.support.v7.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:50) at android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallbackBase.dispatchKeyEvent(AppCompatDelegateImplBase.java:224) at android.support.v7.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:50) at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:2438) at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:4643) at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4598) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4129) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4182) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4148) at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4262) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4156) at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4319) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4129) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4182) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4148) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4156) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4129) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4182) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4148) at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4295) at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:4482) at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2480) at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:2074) at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:2065) at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(Input 01-09 12:32:35.149 11642-11642/victory1908.nlbstafflogin2 D/AndroidRuntime: Shutting down VM 01-09 12:32:35.149 11642-11642/victory1908.nlbstafflogin2 E/AndroidRuntime: FATAL EXCEPTION: main Process: victory1908.nlbstafflogin2, PID: 11642 java.lang.IndexOutOfBoundsException: Invalid index 1, size is 0 at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) at java.util.ArrayList.get(ArrayList.java:308) at android.support.design.widget.TabLayout.getTabAt(TabLayout.java:448) at android.support.design.widget.TabLayout$TabLayoutOnPageChangeListener.onPageSelected(TabLayout.java:1759) at android.support.v4.view.ViewPager.dispatchOnPageSelected(ViewPager.java:1794) at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:548) at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:514) at android.support.v4.view.ViewPager.onRestoreInstanceState(ViewPager.java:1320) at android.view.View.dispatchRestoreInstanceState(View.java:14831) at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3183) at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3189) at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3189) at android.view.View.restoreHierarchyState(View.java:14809) at android.support.v4.app.Fragment.restoreViewState(Fragment.java:468) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1094) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248) at android.support.v4.app.BackStackRecord.popFromBackStack(BackStackRecord.java:958) at android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1666) at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:586) at android.support.v4.app.FragmentActivity.onBackPressed(FragmentActivity.java:169) at victory1908.nlbstafflogin2.MainActivity.onBackPressed(MainActivity.java:132) at android.app.Activity.onKeyUp(Activity.java:2576) at android.view.KeyEvent.dispatch(KeyEvent.java:3171) at android.app.Activity.dispatchKeyEvent(Activity.java:2831) at android.support.v7.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:50) at android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallbackBase.dispatchKeyEvent(AppCompatDelegateImplBase.java:224) at android.support.v7.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:50) at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:2438) at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:4643) at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4598) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4129) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4182) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4148) at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4262) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4156) at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4319) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4129) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4182) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4148) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4156) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4129) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4182) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4148) at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4295) at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:4482) at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2480) at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:2074) at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:2065) at android.view.inputmeth



请帮忙。如果您需要其他文件,请发表评论。

最佳答案

如果您有此行:

tabLayout.setupWithViewPager(viewPager);

您无需手动选择标签(可以删除这部分代码):
tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
    @Override
    public void onTabSelected(TabLayout.Tab tab) {
        viewPager.setCurrentItem(tab.getPosition());
    }

    @Override
    public void onTabUnselected(TabLayout.Tab tab) {
        viewPager.setCurrentItem(tab.getPosition());
    }

    @Override
    public void onTabReselected(TabLayout.Tab tab) {
        viewPager.setCurrentItem(tab.getPosition());
    }
});

发生崩溃(IndexOutOfBounds)的原因可能是因为您尝试在某处尝试使用无效索引在 View 分页器或tabLayout上设置当前位置(当前所选项目)。您可以附加ManageEventAssigned代码吗?

关于android - 使用TabLayout和ViewPager时,应用程序在选项卡2的后退按钮上崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34689290/

相关文章:

java - 类型参数 T 隐藏了类型 T

java - StartApp 广告未显示在我的应用程序上

android - fragment 与单一复杂布局

android - FragmentActivity 类型未定义方法 startSupportActionMode(ActionMode.Callback)?

c# - 后台线程上的 new System.Transactions.TransactionScope() 会停止程序

c - 可执行文件(用 C 语言编写)是否存在某种内存限制才能正常运行?

javascript - React-navigation 在调试时工作正常但在 Release模式下不工作

java - 使用正则表达式从字符串中提取手机号码

java - 想要在 viewpager 页面上启动动画,但页面正在预加载

asp.net - 导致应用程序崩溃的未处理异常,日志中显示 "EventType clr20r3, P1 w3wp.exe",但没有详细信息