如何获得ActionBar视图?

Emi*_*Adz 29 android view android-actionbar showcaseview android-actionbar-compat

我正在使用该Showcase库向用户解释我的应用程序功能.在某些方面,我需要调暗整体ActionBar以向用户呈现另一个功能.

为此,我正在使用setAlpha(float num)View课程.因此,为了做到这一点,我需要得到我的实际视图实例ActionBar

顺便说一句,我正在使用support-7-appcompat为旧系统提供ActionBar支持的库.

更新

在此期间,如果您配置自定义视图并ActionBar使用以下命令将其添加到您,我找到了此选项:

getSupportActionBar().setCustomView(v);
Run Code Online (Sandbox Code Playgroud)

然后得到ViewActionBar,你可以这样做:

(View) activity.getSupportActionBar().getCustomView().getParent().getParent()
Run Code Online (Sandbox Code Playgroud)

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

idu*_*olz 47

是的.您可以使用此函数实际获取视图:

public View getActionBarView() {
    Window window = getWindow();
    View v = window.getDecorView();
    int resId = getResources().getIdentifier("action_bar_container", "id", "android");
    return v.findViewById(resId);
}
Run Code Online (Sandbox Code Playgroud)

几乎这种方式的工作方式是操作栏容器使用id android.R.id.action_bar_container,但这个id不是公共的.因此我们使用getIdentifier()来检索此id,然后其余的很简单.

  • 在带有ActionBar Compat的Android 2.3中不起作用,但与getPackageName()而不是"android"一起使用. (5认同)
  • 在`support-library-v7-r21.0.3`上使用`ActionBarActivity`和`Theme.Appcompat`,`v.findViewById(resId)`返回`null`.`resId`虽然有效.任何建议. (5认同)
  • 如果我使用actionbarsherlock怎么办? (2认同)
  • @ThuyTrinh 我认为它是 actionbarsherlock 的 `abs__action_bar_container` (2认同)

and*_*per 8

我认为这个解决方案更完整,处理正常的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();
}
Run Code Online (Sandbox Code Playgroud)


Rah*_*aei 6

for 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;
}
Run Code Online (Sandbox Code Playgroud)


Moh*_*san 5

我对 @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;
}
Run Code Online (Sandbox Code Playgroud)