我正在使用Showcase
库来解释我的应用功能
用户。在某些方面,我需要将整个ActionBar
调暗到现在
用户的另一个功能。
为此,我使用了setAlpha(float num)
类的View
。因此,为此,我需要获取ActionBar
顺便说一下,我使用的support-7-appcompat
库为旧系统提供了ActionBar支持。
与此同时,我找到了此选项,如果您配置自定义视图并使用以下内容将其添加到ActionBar
:
getSupportActionBar().setCustomView(v);
然后获取您可以执行的View
的{{1}}:
ActionBar
有更简单或更简单的方法吗?
答案 0 :(得分:47)
是的。您可以使用此函数实际获取视图:
public View getActionBarView() {
Window window = getWindow();
View v = window.getDecorView();
int resId = getResources().getIdentifier("action_bar_container", "id", "android");
return v.findViewById(resId);
}
这种方式的工作原理是操作栏容器使用标识android.R.id.action_bar_container
,但此标识不公开。因此,我们使用getIdentifier()来检索此id,然后其余的很简单。
答案 1 :(得分:7)
我认为这个解决方案更完整,处理正常的Activity和ActionBarActivity。
它还处理使用工具栏设置操作栏的情况,但您需要在您创建的活动中实现它:
public static View getActionBarView(final Activity activity) {
if (activity instanceof IToolbarHolder)
return ((IToolbarHolder) activity).getToolbar();
final String packageName = activity instanceof ActionBarActivity ? activity.getPackageName() : "android";
final int resId = activity.getResources().getIdentifier("action_bar_container", "id", packageName);
final View view = activity.findViewById(resId);
return view;
}
public interface IToolbarHolder {
public android.support.v7.widget.Toolbar getToolbar();
}
答案 2 :(得分:6)
support.v7 getActionBarView(ById)无法正常工作。
这将返回actionBar工具栏:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewGroup actionBar = getActionBar(getWindow().getDecorView());
TextView actionBarTitle = (TextView) actionBar.getChildAt(0);
}
public ViewGroup getActionBar(View view) {
try {
if (view instanceof ViewGroup) {
ViewGroup viewGroup = (ViewGroup) view;
if (viewGroup instanceof android.support.v7.widget.Toolbar) {
return viewGroup;
}
for (int i = 0; i < viewGroup.getChildCount(); i++) {
ViewGroup actionBar = getActionBar(viewGroup.getChildAt(i));
if (actionBar != null) {
return actionBar;
}
}
}
} catch (Exception e) {
}
return null;
}
答案 3 :(得分:4)
我对@idunnololz代码做了一些修改以支持ActionBarSherlock
private View getActionBarView() {
int actionViewResId = 0;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
actionViewResId = getResources().getIdentifier(
"abs__action_bar_container", "id", getPackageName());
} else {
actionViewResId = Resources.getSystem().getIdentifier(
"action_bar_container", "id", "android");
}
if (actionViewResId > 0) {
return this.findViewById(actionViewResId);
}
return null;
}
答案 4 :(得分:3)
在使用原生Toolbar
,您自己的appcompat ActionBar
或Lollipop上的原生ActionBar
时,这将获得Toolbar
/ Toolbar
:< / p>
public static ViewGroup findActionBar(Activity activity) {
int id = activity.getResources().getIdentifier("action_bar", "id", "android");
ViewGroup actionBar = null;
if (id != 0) {
actionBar = (ViewGroup) activity.findViewById(id);
}
if (actionBar == null) {
actionBar = findToolbar((ViewGroup) activity.findViewById(android.R.id.content)
.getRootView());
}
return actionBar;
}
private static ViewGroup findToolbar(ViewGroup viewGroup) {
ViewGroup toolbar = null;
for (int i = 0, len = viewGroup.getChildCount(); i < len; i++) {
View view = viewGroup.getChildAt(i);
if (view.getClass().getName().equals("android.support.v7.widget.Toolbar")
|| view.getClass().getName().equals("android.widget.Toolbar")) {
toolbar = (ViewGroup) view;
} else if (view instanceof ViewGroup) {
toolbar = findToolbar((ViewGroup) view);
}
if (toolbar != null) {
break;
}
}
return toolbar;
}