J'essaie d'obtenir la hauteur de ActionBar
(à l'aide de Sherlock) chaque fois qu'une activité est créée (spécialement pour gérer les modifications de configuration en rotation, la hauteur de la barre Action pouvant être modifiée).
Pour cela, j'utilise la méthode ActionBar.getHeight()
qui ne fonctionne que lorsque le ActionBar
est affiché.
Lorsque la première activité est créée pour la première fois, je peux appeler getHeight()
dans le rappel onCreateOptionsMenu
. Mais cette méthode ne s'appelle pas après.
Donc ma question est quand puis-je appeler getHeight () et être assuré qu'il ne retourne pas 0? Ou, si ce n’est pas possible, comment puis-je régler la hauteur de la barre d’action?
Si la réponse de @ birdy est une option si vous souhaitez contrôler explicitement la taille de la barre d’action, il existe un moyen de la récupérer sans verrouiller la taille que j’ai trouvée dans la documentation de support. C'est un peu gênant mais cela a fonctionné pour moi. Vous aurez besoin d'un contexte, cet exemple serait valide dans une activité.
// Calculate ActionBar height
TypedValue tv = new TypedValue();
if (getTheme().resolveAttribute(Android.R.attr.actionBarSize, tv, true))
{
actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
}
En XML, vous devriez utiliser cet attribut:
Android:paddingTop="?android:attr/actionBarSize"
Ok, je cherchais dans ce post plusieurs fois, alors je pense que ce sera bien de décrire non seulement Sherlock, mais aussi appcompat:
hauteur de la barre d'action en utilisant appCompat
Assez similaire à la description de @Anthony, vous pouvez le trouver avec le code suivant (je viens de changer l'identifiant de la ressource):
TypedValue tv = new TypedValue();
if (getActivity().getTheme().resolveAttribute(R.attr.actionBarSize, tv, true))
{
int actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
}
Problème avant Sandwitch
J'avais besoin de la hauteur de la barre d'action car, sur les périphériques antérieurs à ICE_CREAM_SANDWITCH, ma vue chevauchait la barre d'action. J'ai essayé de configurer Android: layout_marginTop = "? Android: attr/actionBarSize", Android: layout_marginTop = "? Attr/actionBarSize", le chevauchement de l'affichage/barre d'actions et même la hauteur fixe de la barre d'actions avec un thème personnalisé, mais rien ne fonctionnait. Voilà à quoi ça ressemblait:
Malheureusement, j’ai découvert qu’avec la méthode décrite ci-dessus, je n’obtiens que la moitié de la hauteur (je suppose que la barre d’options n’est pas prise en place), donc pour corriger complètement l’isue il me faut double hauteur de la barre d’action et tout le reste Semble ok:
Si quelqu'un connaît une meilleure solution (que de doubler actionBarHeight), je serai heureux de me le faire savoir car je viens du développement iOS et que j'ai trouvé la plupart des Android vues assez déroutantes :)
Cordialement,
hris.to
@Anthony answer fonctionne pour les périphériques prenant en charge ActionBar
et pour ceux qui prennent en charge uniquement Sherlock Action Bar
, la méthode suivante doit être utilisée
TypedValue tv = new TypedValue();
if (getTheme().resolveAttribute(Android.R.attr.actionBarSize, tv, true))
actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
if(actionBarHeight ==0 && getTheme().resolveAttribute(com.actionbarsherlock.R.attr.actionBarSize, tv, true)){
actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
}
//OR as stated by @Marina.Eariel
TypedValue tv = new TypedValue();
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB){
if (getTheme().resolveAttribute(Android.R.attr.actionBarSize, tv, true))
actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
}else if(getTheme().resolveAttribute(com.actionbarsherlock.R.attr.actionBarSize, tv, true){
actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
}
je pense que le moyen le plus sûr serait:
private int getActionBarHeight() {
int actionBarHeight = getSupportActionBar().getHeight();
if (actionBarHeight != 0)
return actionBarHeight;
final TypedValue tv = new TypedValue();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
if (getTheme().resolveAttribute(Android.R.attr.actionBarSize, tv, true))
actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data, getResources().getDisplayMetrics());
} else if (getTheme().resolveAttribute(com.actionbarsherlock.R.attr.actionBarSize, tv, true))
actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data, getResources().getDisplayMetrics());
return actionBarHeight;
}
Pour définir la hauteur de ActionBar
, vous pouvez créer un nouveau Theme
comme celui-ci:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.FixedSize" parent="Theme.Sherlock.Light.DarkActionBar">
<item name="actionBarSize">48dip</item>
<item name="Android:actionBarSize">48dip</item>
</style>
</resources>
et réglez cette Theme
sur votre Activity
:
Android:theme="@style/Theme.FixedSize"
Si vous utilisez une barre d’outils comme ActionBar,
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
ensuite, utilisez simplement layout_height de la barre d’outils.
int actionBarHeight = toolbar.getLayoutParams().height;
Java:
int actionBarHeight;
int[] abSzAttr;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
abSzAttr = new int[] { Android.R.attr.actionBarSize };
} else {
abSzAttr = new int[] { R.attr.actionBarSize };
}
TypedArray a = obtainStyledAttributes(abSzAttr);
actionBarHeight = a.getDimensionPixelSize(0, -1);
xml:
?attr/actionBarSize
vous pouvez utiliser cette fonction pour obtenir la hauteur de la barre d’action.
public int getActionBarHeight() {
final TypedArray ta = getContext().getTheme().obtainStyledAttributes(
new int[] {Android.R.attr.actionBarSize});
int actionBarHeight = (int) ta.getDimension(0, 0);
return actionBarHeight;
}
Cette méthode d'assistance devrait être utile pour quelqu'un. Exemple: int actionBarSize = getThemeAttributeDimensionSize(this, Android.R.attr.actionBarSize);
public static int getThemeAttributeDimensionSize(Context context, int attr)
{
TypedArray a = null;
try{
a = context.getTheme().obtainStyledAttributes(new int[] { attr });
return a.getDimensionPixelSize(0, 0);
}finally{
if(a != null){
a.recycle();
}
}
}
vous devez juste ajouter ceci.
public int getActionBarHeight() {
int height;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
height = getActivity().getActionBar().getHeight();
} else {
height = ((ActionBarActivity) getActivity()).getSupportActionBar().getHeight();
}
return height;
}
En XML, vous pouvez utiliser? Attr/actionBarSize, mais si vous avez besoin d'accéder à cette valeur dans Java, vous devez utiliser le code ci-dessous:
public int getActionBarHeight() {
int actionBarHeight = 0;
TypedValue tv = new TypedValue();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
if (getTheme().resolveAttribute(Android.R.attr.actionBarSize, tv,
true))
actionBarHeight = TypedValue.complexToDimensionPixelSize(
tv.data, getResources().getDisplayMetrics());
} else {
actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,
getResources().getDisplayMetrics());
}
return actionBarHeight;
}
La hauteur de la barre d'action diffère selon le thème appliqué. Si vous utilisez AppCompatActivity, la hauteur sera dans la plupart des cas différente de l'activité normale.
Si vous utilisez AppCompatActivity, vous devez utiliser R.attr.actionBarSize au lieu d’Android.R.attr.actionBarSize.
public static int getActionBarHeight(Activity activity) {
TypedValue typedValue = new TypedValue();
int attributeResourceId = Android.R.attr.actionBarSize;
if (activity instanceof AppCompatActivity) {
attributeResourceId = R.attr.actionBarSize;
}
if (activity.getTheme().resolveAttribute(attributeResourceId, typedValue, true)) {
return TypedValue.complexToDimensionPixelSize(typedValue.data, activity.getResources().getDisplayMetrics());
}
return (int) Math.floor(activity.getResources()
.getDimension(R.dimen.my_default_value));
}
J'ai trouvé un moyen plus générique de le découvrir:
int[] location = new int[2];
mainView.getLocationOnScreen(location);
int toolbarHeight = location[1];
où 'mainView' est la vue racine de votre mise en page.
L'idée est essentiellement d'obtenir la position Y du mainView tel qu'il est défini juste en dessous du ActionBar (ou barre d'outils).
Si vous utilisez Xamarin/C #, voici le code que vous recherchez:
var styledAttributes = Context.Theme.ObtainStyledAttributes(new[] { Android.Resource.Attribute.ActionBarSize });
var actionBarSize = (int)styledAttributes.GetDimension(0, 0);
styledAttributes.Recycle();
Une méthode prête à répondre à la réponse la plus populaire:
public static int getActionBarHeight(
Activity activity) {
int actionBarHeight = 0;
TypedValue typedValue = new TypedValue();
try {
if (activity
.getTheme()
.resolveAttribute(
Android.R.attr.actionBarSize,
typedValue,
true)) {
actionBarHeight =
TypedValue.complexToDimensionPixelSize(
typedValue.data,
activity
.getResources()
.getDisplayMetrics());
}
} catch (Exception ignore) {
}
return actionBarHeight;
}
The action bar now enhanced to app bar.So you have to add conditional check for getting height of action bar.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
height = getActivity().getActionBar().getHeight();
} else {
height = ((ActionBarActivity) getActivity()).getSupportActionBar().getHeight();
}
Après avoir essayé tout ce qui se passe là-bas sans succès, j'ai découvert par hasard un moyen fonctionnel et très facile d'obtenir la hauteur par défaut de la barre d'action.
Testé uniquement dans les API 25 et 24
C #
Resources.GetDimensionPixelSize(Resource.Dimension.abc_action_bar_default_height_material);
Java
getResources().getDimensionPixelSize(R.dimen.abc_action_bar_default_height_material);
Voici une version mise à jour avec Kotlin que j'ai utilisée en supposant que le téléphone est supérieur à Honeycomb:
val actionBarHeight = with(TypedValue().also {context.theme.resolveAttribute(Android.R.attr.actionBarSize, it, true)}) {
TypedValue.complexToDimensionPixelSize(this.data, resources.displayMetrics)
}
Dans javafx (avec Gluon), la hauteur est définie au moment de l'exécution ou à un niveau similaire. Tout en étant capable d'obtenir la largeur comme d'habitude ...
double width = appBar.getWidth();
Vous devez créer un auditeur:
GluonApplication application = this;
application.getAppBar().heightProperty().addListener(new ChangeListener(){
@Override
public void changed(ObservableValue observable, Object oldValue, Object newValue) {
// Take most recent value given here
application.getAppBar.heightProperty.get()
}
});
... et prenons la valeur la plus récente pour laquelle elle a changé. Pour avoir la hauteur.
Un moyen simple de trouver la hauteur de la barre d’action consiste à utiliser la méthode Activity onPrepareOptionMenu
.
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
....
int actionBarHeight = getActionBar().getHeight());
.....
}