sle*_*dav 4 android android-actionbar
我想要实现的是禁用ActionBar上的所有项目,除了一个.我有一个自定义ActionBar有Menu几个TextViews,一个Button和Spinner从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,但保持可见?
注意:我想在片段中实现它.
是的,可以禁用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(或从中派生的任何视图),则返回的列表应仅包含一个项目.
上面的代码介绍如何获得Spinner在Activity.当然,Spinner在a中禁用from 不是问题Fragment.片段具有对其活动的引用,因此活动可以通过某个接口将代码暴露给片段.