web-dev-qa-db-ja.com

ActionBarビューを取得する方法は?

Showcaseライブラリを使用して、アプリケーションの機能をユーザーに説明しています。ある時点で、ActionBar全体を暗くして、ユーザーに別の機能を提示する必要があります。

そのために、ViewクラスのsetAlpha(float num)を使用しています。そのため、ActionBarの実際のビューインスタンスを取得する必要があります

ところで、古いシステムのActionBarサポートを提供するsupport-7-appcompatライブラリを使用しています。

更新

それまでの間、私はこのオプションを見つけました。カスタムビューを構成し、ActionBarを使用して追加する場合:

getSupportActionBar().setCustomView(v);

次に、ViewActionBarを取得します。

(View) activity.getSupportActionBar().getCustomView().getParent().getParent()

それを行う簡単な方法はありますか?

29
Emil Adz

うん。この関数を使用して、実際にビューを取得できます。

public View getActionBarView() {
    Window window = getWindow();
    View v = window.getDecorView();
    int resId = getResources().getIdentifier("action_bar_container", "id", "Android");
    return v.findViewById(resId);
}

これが機能するほとんどの方法は、actionbarコンテナがAndroid.R.id.action_bar_containerが、このIDは公開されていません。したがって、getIdentifier()を使用してこのIDを取得し、残りは簡単です。

47
idunnololz

このソリューションはより完全で、通常の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();
}
8

support.v7 getActionBarView(ById)は機能しません。

これはactionBar Toolbarを返します:

@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;
}
6
Rahmat Rezaei

ActionBarSherlockをサポートするために@idunnololzコードを少し修正しました

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
Mohammad Ersan

これは、ネイティブToolbar、appcompatの独自のActionBar、またはLollipopのネイティブActionBarを使用する場合、Toolbar/Toolbarを取得します。 :

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;
}
3
Jared Rummler