Hauteur de la barre d'état?
y a-t-il un moyen d'obtenir la hauteur du statusbar + titlebar? Vérifier le forum dev montre la même question mais pas de solution (que j'ai pu trouver).
je sais que nous pouvons l'obtenir après la passe de mise en page initiale, mais je cherche à l'obtenir dans onCreate() de mon activité.
Merci
10 réponses
Rect rectgle= new Rect();
Window window= getWindow();
window.getDecorView().getWindowVisibleDisplayFrame(rectgle);
int StatusBarHeight= rectgle.top;
int contentViewTop=
window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
int TitleBarHeight= contentViewTop - StatusBarHeight;
Log.i("*** Jorgesys :: ", "StatusBar Height= " + StatusBarHeight + " , TitleBar Height = " + TitleBarHeight);
obtenir la hauteur de la barre d'état sur le onCreate()
méthode de votre activité, utilisez cette méthode:
public int getStatusBarHeight() {
int result = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
return result;
}
bien que ce soit une vieille question, j'ai trouvé que la réponse n'a pas fonctionné dans onCreate()
:
j'ai trouvé ce code de ici qui fonctionne dans la onCreate()
méthode
public int getStatusBarHeight() {
int result = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
return result;
}
j'espère que cela aidera quiconque se heurte à cette question.
pour ceux, comme moi, qui veulent l'utiliser dans vos mises en page XML:
<...
android:layout_marginTop="@*android:dimen/status_bar_height"
... />
ne soyez pas confus par le fait que Android Studio (2.2 Preview 3 -- au moment de l'écriture) ne supporte pas cette notion. Le moteur d'exécution ne. Je l'ai pris dans le code source de Google.
je suggère le code suivant:
Rect rect = new Rect();
Window window = activity.getWindow();
if (window != null) {
window.getDecorView().getWindowVisibleDisplayFrame(rect);
android.view.View v = window.findViewById(Window.ID_ANDROID_CONTENT);
android.view.Display display = ((android.view.WindowManager) activity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
//return result title bar height
return display.getHeight() - v.getBottom() + rect.top;
}
deux exemples:
1) Dispositif 1 marque: samsung, appareil: maguro, conseil: thon, cpu_abi: armeabi-v7a, affichage: ICL53F.M420KREL08, fabricant: samsung, modèle: Nexus Galaxy, ver.version: 4.0.2, ver.sdk: 14;
résolution D'écran: 1280 x 720.Il n'y a aucun bouton matériel sur cet appareil.
Résultats:
rect: left=0 right=720 top=72 bottom=1208;
v: left=0 right=720 top=72 bottom=1208;
display: height=1208 width=720;
correct result=72;
dispositif 1 a la barre de titre en haut de l'écran et la barre d'état avec le logiciel de boutons au bas de l'écran.
2) Dispositif 2 dispositif: bravo, planche: bravo, cpu_abi: armeabi-v7a, affichage: FRG83G, constructeur: HTC, modèle: HTC Desire, ver.version: 2.2.2, ver.sdk: 8,
résolution d'écran: 800 x 400. Cet appareil a des boutons matériels.
Résultats:
rect: left=0 right=480 top=38 bottom=800;
v: left=0 right=480 top=0 bottom=800;
display: height=800 width=480;
correct result: phone_bar_height=38;
périphérique 2 A barre de titre en haut de la l'écran et n'a pas de barre d'état.
deux solutions ont été suggérées ci-dessus:
A) v.getTop() - rect.top
( il est incorrect pour le dispositif 1 - il donne 0 au lieu de 72)
B) display.getHeight() - v.getHeight()
( il est incorrect pour le dispositif 2 - il donne 0 au lieu de 38)
variante:
display.getHeight() - v.getBottom() + rect.top
donne des résultats corrects dans les deux cas.
mise à Jour
3) un autre exemple (troisième dispositif): marque: LGE, appareil: v909, cpu_abi: armeabi-v7a, affichage: HMJ37, modèle: LG-V909, ver.version: 3.1, ver.sdk: 12
rect: left=0 right=1280 top=0 bottom=720
v: left=0 right=1280 top=0 bottom=720
Display: height=768 width=1280
phone_bar_height=48
Appareil 3 a l'horizontale, n'a pas de barre de titre en haut de l'écran et dispose de barre d'état au bas de l'écran.
Donc, ici:
int size_of_title_bar = rect.top;
int size_of_status_bar = display.getHeight() - v.getBottom();
c'est correct pour dispositifs 2 et 3. Je ne suis pas sûr pour l'appareil 1. L'utilisateur m'a envoyé la capture d'écran du périphérique 1. Il y a une barre d'état avec le bouton du logiciel. Mais l'expression "d'affichage.getHeight () - v. getBottom ()" donne 0.
attachez un runnable à l'une de vos vues dans votre méthode onCreate, et placez le code ci-dessus là. Cela va amener l'application à calculer la barre d'état + hauteur de titre lorsqu'ils sont attachés à l'écran.
regardez le code ci-dessous:
myView.post(new Runnable() {
@Override
public void run() {
Rect rectgle= new Rect();
Window window= getWindow();
window.getDecorView().getWindowVisibleDisplayFrame(rectgle);
int StatusBarHeight= rectgle.top;
int contentViewTop= window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
int TitleBarHeight= contentViewTop - StatusBarHeight;
}
});
si cela ne fonctionne toujours pas, essayez d'invoquer la méthode postDelayed de la vue au lieu de post et d'ajouter une valeur milliseconde comme second argument.
la façon prise en charge pour obtenir la hauteur de la barre d'état est d'utiliser WindowInsets
classe à partir de API 21+:
customView.setOnApplyWindowInsetsListener((view, insets) -> {
// Handle insets
return insets.consumeSystemWindowInsets();
});
ou WindowInsetsCompat
pour les bibliothèques de soutien:
ViewCompat.setOnApplyWindowInsetsListener(customView, (view, insets) -> {
// Handle insets
return insets.consumeSystemWindowInsets();
});
vous pouvez également outrepasser la méthode onApplyWindowInsets
à l'intérieur de la vue:
public class CustomView extends View {
@Override
public WindowInsets onApplyWindowInsets(final WindowInsets insets) {
final int statusBarHeight = insets.getStableInsetTop();
return insets.consumeStableInsets();
}
}
pour plus de détails, je vous recommande de vérifier Chris Banes talk - devenir une fenêtre principale fitter (diapositives disponibles ici ).
vous pouvez aussi prendre la dimension de la barre d'état trouvée dans les dimensions.fichier xml d'android en utilisant la façon que ce billet de blog décrit.
cela peut obtenir la hauteur de la barre de statusbar sans avoir à attendre le dessin.
citant le code du billet de blog:
public int getStatusBarHeight() {
int result = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
return result;
}
vous devez mettre cette méthode dans une classe ContextWrapper.
je pense que la meilleure façon de calculer qui est d'obtenir la hauteur de fullscreen moins notre disposition principale
phoneBarsHeight = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getHeight()
- mainView.getHeight();
Et vous pouvez le mettre dans onGlobalLayout()
. Cela fonctionne sur les tablettes aussi, je l'ai essayé sur le thème.NoTitleBar, mais ça doit toujours marcher.
peut-être Pouvez-vous même l'améliorer et l'utiliser onCreate()
en remplaçant mainView.getHeight()
par mainView.getMeasuredHeight()
.
la solution Postée par Jorgesys est très bonne, mais elle ne fonctionne pas à l'intérieur de la méthode onCreate (). Je suppose que c'est parce que statusbar et titlebar sont créés après onCreate().
la solution est simple - vous devez placer le code dans runnable et l'exécuter après onCreate () en utilisant root.post((Runnable action) );
ainsi la solution entière:
root = (ViewGroup)findViewById(R.id.root);
root.post(new Runnable() {
public void run(){
Rect rectgle= new Rect();
Window window= getWindow();
window.getDecorView().getWindowVisibleDisplayFrame(rectgle);
int StatusBarHeight= rectgle.top;
int contentViewTop=
window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
int TitleBarHeight= contentViewTop - StatusBarHeight;
Log.i("*** jakkubu :: ", "StatusBar Height= " + StatusBarHeight +
" , TitleBar Height = " + TitleBarHeight);
}
});
je trouve ici
dès API 23 Il y a une meilleure solution pour obtenir la hauteur de la barre d'état. API 23 ajoute une fonctionnalité WindowInsets
, de sorte que vous pouvez utiliser ce code pour obtenir la taille du système insets, dans ce cas au sommet.
public int getStatusBarHeight() {
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
return binding.mainContent.getRootWindowInsets().getStableInsetTop();
}
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if(resourceId != 0) {
return getResources().getDimensionPixelSize(resourceId);
}
return 0;
}
notez que getRootWindowInsets()
retournera null jusqu'à ce que la vue ait été attachée à une fenêtre de sorte qu'elle ne peut pas être utilisée directement dans onCreate()
mais vous pouvez ajouter un auditeur pour la fenêtre attacher et le faire - ici j'ajoute la barre d'état inset à la taille de ma barre d'outils, que je cache et montre, avec la barre de statut. Quand il est affiché, Je veux la barre d'état sur le dessus de celui-ci donc j'ajoute la hauteur de la barre d'état au rembourrage supérieur de la barre d'outils.
binding.mainContent.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
@Override
public void onViewAttachedToWindow(View view) {
binding.toolbar.setPadding(binding.toolbar.getPaddingLeft(),
binding.toolbar.getPaddingTop() + getStatusBarHeight(),
binding.toolbar.getPaddingRight(), binding.toolbar.getPaddingBottom());
binding.mainContent.removeOnAttachStateChangeListener(this);
}
@Override
public void onViewDetachedFromWindow(View view) {
}
});