我可以禁用ActionBar的导航Spinner吗?

sle*_*dav 4 android android-actionbar

我想要实现的是禁用ActionBar上的所有项目,除了一个.我有一个自定义ActionBarMenu几个TextViews,一个ButtonSpinner从ListNavigation.Spinner是因为bar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);这样创建的:

    SpinnerAdapter spinnerAdapter = new ArrayAdapter<String>(this.getActivity(), R.layout.action_bar_spinner, names);
    // "listener" for spinner
    bar.setListNavigationCallbacks(spinnerAdapter, new OnNavigationListener() {
        @Override
        public boolean onNavigationItemSelected(int position, long itemId) {
            // do some stuff

            return true;
        }
    });
Run Code Online (Sandbox Code Playgroud)

我想禁用Spinner它,使其处于非活动状态,但在禁用它之前仍然可以看到最后一项.简而言之,我需要一些bar.getNavigationSpinner.setEnabled(false)如果它存在的东西.问题是:有某种解决方法吗?如果没有,有没有办法禁用整体ActionBar,但保持可见?

注意:我想在片段中实现它.

Tom*_*mik 6

是的,可以禁用Spinner列表导航中使用的ActionBar.但这不是一个简单的解决方案,而是一个黑客攻击.ActionBar不提供对Spinner视图的直接访问.不幸的Spinner是,它是在私有代码中创建的,没有任何id.

那么如何访问Spinner实例?一种解决方案可能是通过Java反射API访问它,但我不建议这样做.

更好的解决方案是获取当前的根视图Activity,遍历它的子视图(操作栏及其所有视图都存在于视图层次结构中)并找到正确的视图Spinner.由于Spinner操作栏可能是您自己没有创建的唯一一个,因此您应该能够将其与其他人区分开来.

View这个SO问题中描述了获得根.

遍历非常简单,请记住,如果您使用ActionBarSherlock,则必须寻找IcsSpinner而不是Spinner(IcsSpinner不延伸Spinner).

private View findActionBarSpinner() {
    View rootView = findViewById(android.R.id.content).getRootView();
    List<View> spinners = traverseViewChildren( (ViewGroup) rootView );
    return findListNavigationSpinner(spinners); // implement according to your layouts
}

private List<View> traverseViewChildren(ViewGroup parent) {
    List<View> spinners = new ArrayList<View>();
    for (int i = 0; i < parent.getChildCount(); i++) {
        View child = parent.getChildAt(i);
        if (child instanceof Spinner) {
            spinners.add( child );
        } else if (child instanceof IcsSpinner) { // add this if you are using ActionBarSherlock
            spinners.add( child );
        } else if (child instanceof ViewGroup) {
            spinners.addAll( traverseViewChildren( (ViewGroup) child ) );
        }
    }
    return spinners;
}
Run Code Online (Sandbox Code Playgroud)

该功能findListNavigationSpinner应以您能够区分其他微调器的方式实现.如果您未使用任何Spinner(或从中派生的任何视图),则返回的列表应仅包含一个项目.

上面的代码介绍如何获得SpinnerActivity.当然,Spinner在a中禁用from 不是问题Fragment.片段具有对其活动的引用,因此活动可以通过某个接口将代码暴露给片段.