Action Bar .selectTab() and .setSelectedNavigationItem() not working

社会主义新天地 提交于 2019-12-10 12:23:50

问题


I have an ActionBar with multiple tabs, each linked to a fragment. The problem I have is that when I use either bar.selectTab(Tab) or bar.setSelectedNavigationItem(int), it doesn't work. Specifically, this problem occurs when the tabs get reduced down to a Spinner in the ActionBar.


回答1:


There is a known bug with the ActionBar, specifically with the methods mentioned above and specifically when the ActionBar's tabs are reduced to a Spinner.

Here's my workaround. It uses reflection to drill into the ActionBar if the tabs have been reduced to a Spinner. In your Activity class, create a method like so:

/**
 * A documented and yet to be fixed bug exists in Android whereby
 * if you attempt to set the selected tab of an action bar when the
 * bar's tabs have been collapsed into a Spinner due to screen
 * real-estate, the spinner item representing the tab may not get
 * selected. This bug fix uses reflection to drill into the ActionBar
 * and manually select the correct Spinner item 
 */
private void select_tab(ActionBar b, int pos) {
    try {
        //do the normal tab selection in case all tabs are visible
        b.setSelectedNavigationItem(pos);

        //now use reflection to select the correct Spinner if
        // the bar's tabs have been reduced to a Spinner

        View action_bar_view = findViewById(getResources().getIdentifier("action_bar", "id", "android"));
        Class<?> action_bar_class = action_bar_view.getClass();
        Field tab_scroll_view_prop = action_bar_class.getDeclaredField("mTabScrollView");
        tab_scroll_view_prop.setAccessible(true);
        //get the value of mTabScrollView in our action bar
        Object tab_scroll_view = tab_scroll_view_prop.get(action_bar_view);
        if (tab_scroll_view == null) return;
        Field spinner_prop = tab_scroll_view.getClass().getDeclaredField("mTabSpinner");
        spinner_prop.setAccessible(true);
        //get the value of mTabSpinner in our scroll view
        Object tab_spinner = spinner_prop.get(tab_scroll_view);
        if (tab_spinner == null) return;
        Method set_selection_method = tab_spinner.getClass().getSuperclass().getDeclaredMethod("setSelection", Integer.TYPE, Boolean.TYPE);
        set_selection_method.invoke(tab_spinner, pos, true);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Example usage of this might be:

private void delete_fragment_and_tab(String fragment_tag) {

    //remove the fragment
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.remove(getFragmentManager().findFragmentByTag(fragment_tag));

    //now remove the tab from the ActionBar
    //and select the previous tab
    ActionBar b = getActionBar();
    Tab tab = b.getSelectedTab();
    bar.removeTab(tab);
    select_tab(bar, bar.getNavigationItemCount() -1); 
}


来源:https://stackoverflow.com/questions/15409330/action-bar-selecttab-and-setselectednavigationitem-not-working

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!