使用TabLayout和ViewPager时,应用程序在tab2上的后退崩溃

问题描述:

我有一个名为Manage Rules的片段,并且我为每个TabLayout项目使用TabLayout和ViewPager。每个传呼机上都有2个按钮。当我点击Tab2中的一个按钮时,它会调用一个新的片段,然后我按回去,它会崩溃。我不知道如何解决这个问题,因为Tab1中的相同按钮在我按回时工作。使用TabLayout和ViewPager时,应用程序在tab2上的后退崩溃

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]; 
    } 

} 

}

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

12月1日至9日:32:35.139 11642-11642/victory1908.nlbstafflogin2 E/InputEventSender:异常分派成品信号。 E/MessageQueue-JNI:MessageQueue回调中的异常:handleReceiveCallback 01-09 12:32:35.149 11642-11642/victory1908.nlbstafflogin2 E/MessageQueue-JNI: java.lang.IndexOutOfBoundsException:无效的索引1,大小为0在java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)上的 at android.support java.util.ArrayList.get(ArrayList.java:308) .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) 在android.view.View.dispatchRestoreInstanceState(View.java:14831) 在android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3183) 在android.view.ViewGroup。 dispatchRestoreInstanceState(ViewGroup.java:3189) at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3189) at android.view.View.restoreHierarchyState(View.ja va: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 android.view.KeyEvent.dispatch(KeyEvent.java:3171) 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) 在android.support.v7.app.AppCompatDelegateImplBase $ AppCompatWindowCallbackBase.dispatchKeyEvent(AppCompatDelegateImplBase.java:224) 在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) 在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.InputMeth odManager.invokeFinishedInputEventCallback(InputMethodManager.java:2074) 在android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:2065) 在android.view.inputmethod.InputMethodManager $ ImeInputEventSender.onInputEventFinished(输入 01-09 12:32 :35.149 11642-11642/victory1908.nlbstafflogin2 D/AndroidRuntime:关闭VM 01-09 12:32:35.149 11642-11642/victory1908.nlbstafflogin2 E/AndroidRuntime:致命例外:主要 进程:victory1908.nlbstafflogin2,PID:11642 java.lang.IndexOutOfBoundsException:索引1无效,大小为0 at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) 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) 在android.support.v4.view.ViewPager.onRestoreInstanceState(ViewPager.java:1320) 在android.view.View.dispatchRestoreInstanceState(查看。的java:14831) 在android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3183) 在android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3189) 在android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java: 3189) at android.support.v4.app.FragmentManagerImpl android.view.v4.app.Fragment.restoreViewState(Fragment.java:468) android.view.View.restoreHierarchyState(View.java:14809) 。 moveToState(FragmentManager.java:1094) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248) at android.support.v4.app.BackStackRecord.p opFromBackStack(BackStackRecord.java:958) 在android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1666) 在android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:586) 在android.app.Activity.onKeyUp(Activity.java:2576)在android.support.v4.app.FragmentActivity.onBackPressed(FragmentActivity.java:169) at victory1908.nlbstafflogin2.MainActivity.onBackPressed(MainActivity.java:132) at android.app.Activity.onKeyUp 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) 在android.support.v7.app.AppCompatDelegateImplBase $ AppCompatWindowCallbackBase.dispatchKeyEvent(AppCompatDelegateImplBase.java:224) 在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.java:4598) at android.view.ViewRootImpl $ InputStage.deliver(ViewRootImpl.java:4129) 在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) 在android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:2065) 在android.view.inputmeth

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

+0

如果发生崩溃,请发布堆栈跟踪。 –

+0

堆栈跟踪将有所帮助 –

+0

对不起,但我不能在这里复制任何logcat。因为我的logcat屏幕现在是空白的。试图解决这个问题。 – TruongHieu

如果你有这样一行:

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 )可能是因为某处您尝试使用无效索引在视图寻呼机或tabLayout上设置当前位置(当前选定的项目)。你可以附上ManageEventAssigned的代码吗?