web-dev-qa-db-fra.com

Comment obtenir la vue ActionBar?

J'utilise la bibliothèque Showcase pour expliquer ma fonctionnalité d'application à l'utilisateur. À un moment donné, j'ai besoin d'atténuer l'ensemble ActionBar pour présenter une autre fonctionnalité à l'utilisateur.

Pour cela, j'utilise la setAlpha(float num) de la classe View. Et donc pour ce faire, je dois obtenir l'instance de vue réelle de mon ActionBar

Soit dit en passant, j'utilise le support-7-appcompat bibliothèque qui prend en charge ActionBar pour les anciens systèmes.

Mise à jour

En attendant, j'ai trouvé cette option, si vous configurez une vue personnalisée et que vous l'ajoutez ActionBar en utilisant:

getSupportActionBar().setCustomView(v);

Ensuite, pour obtenir le View du ActionBar, vous pouvez faire:

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

Existe-t-il un moyen plus simple ou plus facile de le faire?

29
Emil Adz

Oui. Vous pouvez réellement obtenir la vue en utilisant cette fonction:

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

La façon dont cela fonctionne est que le conteneur de la barre d'action utilise l'id Android.R.id.action_bar_container, mais cet identifiant n'est pas public. Par conséquent, nous utilisons getIdentifier () pour récupérer cet identifiant, puis le reste est simple.

47
idunnololz

Je pense que cette solution est plus complète, gérant à la fois l'activité normale et ActionBarActivity.

Il gère également le cas où la barre d'actions a été définie à l'aide d'une barre d'outils, mais vous devez l'implémenter dans l'activité que vous avez créée:

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
android developer

pour support.v7 getActionBarView (ById) ne fonctionne pas.

cela renvoie la barre d'outils 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;
}
6
Rahmat Rezaei

J'ai fait un petit correctif sur le code @idunnololz pour prendre en charge 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
Mohammad Ersan

Cela obtiendra le Toolbar/ActionBar lorsque vous utilisez le natif ActionBar, votre propre Toolbar d'Appcompat, ou le natif Toolbar sur Lollipop :

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