How to set active item in the Action Bar drop-down navigation?

前端 未结 5 1117
清歌不尽
清歌不尽 2020-12-13 00:23

I\'m trying to fix the issue with restarting activity on orientation changes.

I have an ActionBar with drop-down list navigation and after every rotatio

5条回答
  •  死守一世寂寞
    2020-12-13 00:45

    Codesnippet on Gist


    @Override
    public void onPageScrollStateChanged(int state) {
    }
    
    
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    }
    
    
    @Override
    public void onPageSelected(int position) {
        actionBar.setSelectedNavigationItem(position);
    
        selectInSpinnerIfPresent(position, true);
    }
    
    
    /**
     * Hack that takes advantage of interface parity between ActionBarSherlock and the native interface to reach inside
     * the classes to manually select the appropriate tab spinner position if the overflow tab spinner is showing.
     * 
     * Related issues: https://github.com/JakeWharton/ActionBarSherlock/issues/240 and
     * https://android-review.googlesource.com/#/c/32492/
     * 
     * @author toulouse@crunchyroll.com
     */
    private void selectInSpinnerIfPresent(int position, boolean animate) {
        try {
            View actionBarView = findViewById(R.id.abs__action_bar);
            if (actionBarView == null) {
                int id = getResources().getIdentifier("action_bar", "id", "android");
                actionBarView = findViewById(id);
            }
    
            Class actionBarViewClass = actionBarView.getClass();
            Field mTabScrollViewField = actionBarViewClass.getDeclaredField("mTabScrollView");
            mTabScrollViewField.setAccessible(true);
    
            Object mTabScrollView = mTabScrollViewField.get(actionBarView);
            if (mTabScrollView == null) {
                return;
            }
    
            Field mTabSpinnerField = mTabScrollView.getClass().getDeclaredField("mTabSpinner");
            mTabSpinnerField.setAccessible(true);
    
            Object mTabSpinner = mTabSpinnerField.get(mTabScrollView);
            if (mTabSpinner == null) {
                return;
            }
    
            Method setSelectionMethod = mTabSpinner.getClass().getSuperclass().getDeclaredMethod("setSelection", Integer.TYPE, Boolean.TYPE);
            setSelectionMethod.invoke(mTabSpinner, position, animate);
    
            Method requestLayoutMethod = mTabSpinner.getClass().getSuperclass().getDeclaredMethod("requestLayout");
            requestLayoutMethod.invoke(mTabSpinner);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
    

    this hack around the official Android Bug did it for me, the codesnippet above did not :/

提交回复
热议问题