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容器使用id
android.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!虽然这段代码可以回答这个问题,但最好包含一些上下文,解释它是如何