Android 如何获取ActionBar视图?
我正在使用Android 如何获取ActionBar视图?,android,view,android-actionbar,android-actionbar-compat,showcaseview,Android,View,Android Actionbar,Android Actionbar Compat,Showcaseview,我正在使用Showcase库向您解释我的应用程序功能 用户。在某些情况下,我需要使整个操作栏变暗以显示 为用户提供另一项功能 为此,我使用了视图类的setAlpha(float num)。为此,我需要获取我的ActionBar 顺便说一句,我正在使用support-7-appcompat库,它为旧系统提供ActionBar支持 更新 同时,如果您配置自定义视图并使用以下方法将其添加到ActionBar,我发现了此选项: getSupportActionBar().setCustomView(v)
Showcase
库向您解释我的应用程序功能
用户。在某些情况下,我需要使整个操作栏变暗以显示
为用户提供另一项功能
为此,我使用了视图
类的setAlpha(float num)
。为此,我需要获取我的ActionBar
顺便说一句,我正在使用support-7-appcompat
库,它为旧系统提供ActionBar支持
更新
同时,如果您配置自定义视图并使用以下方法将其添加到ActionBar
,我发现了此选项:
getSupportActionBar().setCustomView(v);
然后,要获取操作栏的视图
,您可以执行以下操作:
(View) activity.getSupportActionBar().getCustomView().getParent().getParent()
有更简单或更简单的方法吗?是的。您可以使用此函数实际获取视图:
public View getActionBarView() {
Window window = getWindow();
View v = window.getDecorView();
int resId = getResources().getIdentifier("action_bar_container", "id", "android");
return v.findViewById(resId);
}
其工作原理是actionbar容器使用idandroid.R.id.action\u bar\u容器
,但该id不是公共的。因此,我们使用getIdentifier()来检索这个id,其余的都很简单。我对@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;
}
private视图getActionBarView(){
int actionViewResId=0;
if(Build.VERSION.SDK\u INT0){
返回此.findViewById(actionViewResId);
}
返回null;
}
我认为这个解决方案更完整,可以处理正常活动和ActionBarActivity
它还处理使用工具栏设置actionbar的情况,但您需要在创建的活动中实现它:
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();
}
使用本机操作栏
、appcompat提供的您自己的工具栏
或棒棒糖上的本机工具栏
时,将获得工具栏
:
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;
}
公共静态视图组findActionBar(活动){
int id=activity.getResources().getIdentifier(“操作栏”、“id”、“android”);
ViewGroup actionBar=null;
如果(id!=0){
actionBar=(ViewGroup)activity.findViewById(id);
}
if(actionBar==null){
actionBar=findToolbar((视图组)activity.findViewById(android.R.id.content)
.getRootView());
}
返回操作栏;
}
专用静态视图组findToolbar(视图组视图组){
视图组工具栏=空;
对于(int i=0,len=viewGroup.getChildCount();i用于支持。v7getActionBarView(ById)不起作用
这将返回操作栏工具栏:
@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;
}
@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewGroup actionBar=getActionBar(getWindow().getDecorView());
TextView actionBarTitle=(TextView)actionBar.getChildAt(0);
}
公共视图组getActionBar(视图){
试一试{
if(视图组的视图实例){
ViewGroup ViewGroup=(ViewGroup)视图;
if(android.support.v7.widget.Toolbar的视图组实例){
返回视图组;
}
对于(int i=0;i
如果我使用的是actionbarsherlock怎么办?@ThuyTrinh我认为它的abs\uu action\u bar\u容器
actionbarsherlock@ThuyTrinh你可以用ActionBar Compat检查我的扩展应答器在Android 2.3中不起作用,但可以用getPackageName()代替“Android”在support-library-v7-r21.0.3
上使用ActionBarActivity
和Theme.Appcompat
,v.findViewById(resId)
返回null
<代码>剩余
仍然有效。任何建议。如果我使用action\u bar\u container
,尽管我正在使用appcompat-v7
(r21.0.3)中的ActionBarActivity
,它返回null。我检查并发现actionViewResId
返回正值。我认为不再需要此代码,因为您已经可以从工具栏视图访问actionbar视图。我实际上需要在actionbar标题文本视图中添加一个最大行,但this.findViewById(actionViewResId)
返回空值。我甚至使用了getWindow().getDecorView()
而不是this
和action\u bar\u title
,但这两种情况下actionviewrid
都返回一个值。你能告诉我怎么做吗。编辑抱歉我没有使用工具栏
让我检查一下谷歌代码,也许他们现在正在为actionbar视图使用不同的标识符。我认为最好的解决方案是使用工具栏并自定义它的标题,因为actionbar新布局没有id。没有必要使用最终视图v=window.getDecorView()
,您可以使用活动。findViewById
。@MoshErsan似乎是正确的。也许我是从其他地方得到的。欢迎来到Stack Overflow!虽然这段代码可以回答这个问题,但最好包含一些上下文,解释它是如何