我正在构建这个Android应用程序,我有这个Activity,我有一个ViewPager,托管4个不同的片段。用户可以在这些片段之间滑动并查看其数据。我还有一个菜单,用户可以删除或发送4碎片上显示的记录。
为了弄清楚哪个片段处于活动状态,我运行此代码(来自viewPager所在的Activity):
int activeItem = viewPager.getCurrentItem();
Log.e(TAG, "activeItem = " + activeItem);
Fragment fragment = this.getSupportFragmentManager().getFragments().get(activeItem);
String fragmentName = fragment.getClass().getSimpleName();
Log.e(TAG, "fragment name = " + fragmentName);
if(activeItem == 0) {
showDialog("Confirm Send", "Would you like to send the checked items?",
actionSend, RecordsSent, fragment);
}
else{
showDialog("Confirm Send", "Would you like to send the checked items?",
actionSend, RecordsPending, fragment);
}
我做的是获取活动项,然后在该索引处获取片段(使用getSupportFragmentManager()
)。然后根据活动项目的内容,我很清楚Fragment是活跃的。
这已经工作了很长时间,直到我添加了另一个片段,突然之间,我得到了ClassCastException
。因为在我的showDialog
函数中,我做了类似的事情:
RecordsSent rsFragment = (RecordsSent) fragment;
发生的事情是发送了错误的片段!我的片段是:
RecordsSent RecordsPending RecordsSales RecordsNews
我收到了Class Cast错误,因为我将RecordsPending转换为RecordsSent,反之亦然。然后我用:
列出了我的片段Log.e(TAG, "fragments = " + this.getSupportFragmentManager().getFragments().toString());
然后它显示了RecordsPending 首先然后是RecordsSent。难怪我得到了ClassCastException。 getCurrentItem返回0,supportFragmentManager
中的第0项是RecordsPending 而不是 RecordsSent。
我不知道是什么促使我片段的索引之间切换,这使得这个难题更令人费解。
这是我用来初始化片段的代码。
TextView tv1 = createTab("Sent", new ColorDrawable(Color.parseColor("#006633")));
TextView tv2 = createTab("Pending", new ColorDrawable(Color.parseColor("#CCCC00")));
TextView tv3 = createTab("Daily Sales Report", new ColorDrawable(Color.parseColor("#F7C05F")));
TextView tv4 = createTab("News Records", new ColorDrawable(Color.parseColor("#B72153")));
tabLayout = (TabLayout) findViewById(R.id.tab_layout);
tabLayout.addTab(tabLayout.newTab().setCustomView(tv1).setTag("Sent"));
tabLayout.addTab(tabLayout.newTab().setCustomView(tv2).setTag("Pending"));
tabLayout.addTab(tabLayout.newTab().setCustomView(tv3).setTag("Sales"));
tabLayout.addTab(tabLayout.newTab().setCustomView(tv4).setTag("News"));
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
//more code here
viewPager = (ViewPager) findViewById(R.id.pager);
adapter = new PagerAdapter (getSupportFragmentManager(), tabLayout.getTabCount());
Log.e(TAG, "tab count = " + tabLayout.getTabCount());
viewPager.setAdapter(adapter);
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
viewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
我的PagerAdapter类看起来像这样:
public class PagerAdapter extends FragmentStatePagerAdapter {
int mNumOfTabs;
public PagerAdapter(FragmentManager fm, int NumOfTabs) {
super(fm);
this.mNumOfTabs = NumOfTabs;
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
RecordsSent tab1 = new RecordsSent();
return tab1;
case 1:
RecordsPending tab2 = new RecordsPending();
return tab2;
case 2:
RecordsSales tab3 = new RecordsSales();
return tab3;
case 3:
RecordsNews tab4 = new RecordsNews();
return tab4;
default:
return null;
}
}
@Override
public int getCount() {
return mNumOfTabs;
}
}
如您所见,第一项是RecordsSent,然后是RecordsPending。我不知道为什么supportFragmentManager返回相反的顺序。
我试过了:
android.support.v4.app.Fragment fragment = getVisibleFragment();
String fragmentName = fragment.getClass().getSimpleName();
但它仍然返回错误的片段类型。
我也尝试在if-else块中执行此操作:
if(activeItem == 0) {
Log.e(TAG, "fragment is records sent");
fragment = fm.findFragmentByTag("Sent");
showDialog(title, message,
actionDelete, RecordsSent, fragment);
}
else{
//I use "Pending" here
}
但是,当我强制它时,我得到一个空指针异常。
这个问题真的令人沮丧,因为它是在几天前工作,然后突然间却没有。