【发布时间】:2014-11-09 03:02:27
【问题描述】:
在我的 onCreate() 方法中,我尝试手动选择一个选项卡以强制它预加载,然后手动切换回第一个选项卡。但是,当我开始时,第一个选项卡最初显示一个空白屏幕,只有在选择另一个选项卡然后重新选择后才会加载。这是我在 onCreate 中的代码:
//set up tabs
actionBar.addTab(actionBar.newTab()
.setText("Set Current Location")
.setTabListener(new CustomTabListener<SetCurrentLocationFragment>(currLocFragment,this,SetCurrentLocationFragment.class)),true);
actionBar.addTab(actionBar.newTab()
.setText("Input Trip")
.setTabListener(new CustomTabListener<InputNewTripFragment>(inputNewTripFragment,this,InputNewTripFragment.class)));
actionBar.addTab(actionBar.newTab()
.setText("View Trip")
.setTabListener(new CustomTabListener<FoodMilesFragment>(calcMilesFragment,this,FoodMilesFragment.class)));
actionBar.addTab(actionBar.newTab()
.setText("Past Trips")
.setTabListener(new CustomTabListener<TripHistoryFragment>(tripHistoryFragment,this,TripHistoryFragment.class)));
actionBar.addTab(actionBar.newTab()
.setText("Trip Map")
.setTabListener(new CustomTabListener<ResultsMapFragment>(resultsMapFragment,this,ResultsMapFragment.class)));
//quickly pre-load the View Trip
actionBar.setSelectedNavigationItem(2);
actionBar.setSelectedNavigationItem(0);
这是我的 TabListener
private class CustomTabListener<T extends Fragment> implements TabListener {
private Fragment fragment;
private final Activity mBaseActivity;//activity to attach fragment to
private final Class<T> mFragmentClass;
public CustomTabListener(Fragment fragment, Activity activity, Class<T> fragClass)
{
this.fragment = fragment;
mBaseActivity = activity;
mFragmentClass = fragClass;
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
if(fragment == null)
{
throw new IllegalArgumentException("Fragment must already be instantiated.");
}
//if the fragment has not yet been added to the activity, add it now
if(fragment.getActivity() == null || !fragment.isAdded())
ft.add(R.id.tabFragmentFrame, fragment);
ft.show(fragment);
fragment.setUserVisibleHint(true);
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
if(fragment != null)
{
ft.remove(fragment);
fragment.setUserVisibleHint(false);
}
}
}
值得一提的是,我的 TabListener 的这个版本,用 ft.hide(fragment) 代替 ft.remove(fragment) 导致 IllegalStateExceptions - Fragment 已经添加。
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
if(fragment == null)
{
throw new IllegalArgumentException("Fragment must already be instantiated.");
}
//if the fragment has not yet been added to the activity, add it now
if(fragment.getActivity() == null || !fragment.isAdded())
ft.add(R.id.tabFragmentFrame, fragment);
ft.show(fragment);
fragment.setUserVisibleHint(true);
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
if(fragment != null)
{
ft.hide(fragment);
fragment.setUserVisibleHint(false);
}
}
【问题讨论】:
-
您应该注意的一件事是,当您从代码中选择创建选项卡时,应该触发所有在手动选择选项卡时会触发的事件。
标签: android android-layout android-fragments android-actionbar android-tabs