【问题标题】:When selecting an action bar tab manually, tab initially starts blank手动选择操作栏选项卡时,选项卡最初开始为空白
【发布时间】: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


【解决方案1】:

虽然我仍然不知道为什么我之前的代码不起作用 - 我确实发现使用 setSelected = true 将选项卡添加到指定位置确实会使其出现。

//set up tabs   
    actionBar.addTab(actionBar.newTab()
            .setText("Input Trip")
            .setTabListener(new CustomTabListener<InputNewTripFragment>(inputNewTripFragment,this,InputNewTripFragment.class)),0);
    actionBar.addTab(actionBar.newTab()
            .setText("View Trip Footprint")
            .setTabListener(new CustomTabListener<FoodMilesFragment>(calcFoodMilesFragment,this,FoodMilesFragment.class)),1);
    actionBar.addTab(actionBar.newTab()
            .setText("Past Trips")
            .setTabListener(new CustomTabListener<TripHistoryFragment>(tripHistoryFragment,this,TripHistoryFragment.class)),2);
    actionBar.addTab(actionBar.newTab()
            .setText("Trip Map")
            .setTabListener(new CustomTabListener<ResultsMapFragment>(resultsMapFragment,this,ResultsMapFragment.class)),3);

    //quickly pre-load the Food Miles Trip Footprint
    actionBar.setSelectedNavigationItem(1);

    actionBar.addTab(actionBar.newTab()
            .setText("Set Current Location")
            .setTabListener(new CustomTabListener<SetCurrentLocationFragment>(currLocFragment,this,SetCurrentLocationFragment.class)),0,true);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多