如何获得ActionBar视图?

时间:2013-11-16 20:27:51

标签: android view android-actionbar android-actionbar-compat showcaseview

我正在使用Showcase库来解释我的应用功能 用户。在某些方面,我需要将整个ActionBar调暗到现在 用户的另一个功能。

为此,我使用了setAlpha(float num)类的View。因此,为此,我需要获取ActionBar

的实际视图实例

顺便说一下,我使用的support-7-appcompat库为旧系统提供了ActionBar支持。

更新

与此同时,我找到了此选项,如果您配置自定义视图并使用以下内容将其添加到ActionBar

getSupportActionBar().setCustomView(v);

然后获取您可以执行的View的{​​{1}}:

ActionBar

有更简单或更简单的方法吗?

5 个答案:

答案 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;
}