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.
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?
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.
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();
}
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;
}
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;
}
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;
}