Ich habe einige benutzerdefinierte Elemente erstellt und möchte sie programmgesteuert in der oberen rechten Ecke platzieren ( n
Pixel vom oberen Rand und m
Pixel vom rechten Rand). Daher muss ich die Bildschirmbreite und Bildschirmhöhe ermitteln und dann die Position einstellen:
int px = screenWidth - m;
int py = screenHeight - n;
Wie bekomme ich screenWidth
und screenHeight
in der Hauptaktivität?
getMetrics
. Niks Kommentar in seiner Antwort erklärt sogar,getDisplayMetrics
wie groß die System- / Statusleiste ist. Sie können auch die Dichte als jmaculate und LoungeKatt verwenden, um den EXAKTEN Wert zu erhalten:DisplayMetrics dm = getResources().getDisplayMetrics(); float fwidth = dm.density * dm.widthPixels;
Getestet in Android v2.2 (API 8) und v4.0 mit guten Ergebnissen und ohne Fehler / Warnungen .Resources.getSystem().getDisplayMetrics()
. Sie werden keine brauchenContext
, um sie zu bekommen.Antworten:
Wenn Sie die Anzeigeabmessungen in Pixel anzeigen möchten, können Sie Folgendes verwenden
getSize
:Wenn Sie nicht in einem sind
Activity
, können Sie die Standardeinstellung erhaltenDisplay
überWINDOW_SERVICE
:Wenn Sie sich in einem Fragment befinden und dies ausführen möchten, verwenden Sie einfach Activity.WindowManager (in Xamarin.Android) oder getActivity (). GetWindowManager () (in Java).
Vor
getSize
der Einführung (in API-Ebene 13) konnten Sie diegetWidth
undgetHeight
Methoden verwenden, die jetzt veraltet sind:Für den Anwendungsfall, den Sie beschreiben, erscheint jedoch ein Rand / Abstand im Layout angemessener.
Ein anderer Weg ist: DisplayMetrics
Wir können verwenden
widthPixels
, um Informationen zu erhalten für:Beispiel:
quelle
try/catch
für eine solche Prüfung verwenden möchten ? Warum nicht einfachif (android.os.Build.VERSION.SDK_INT >= 13)
ohne Ausnahme verwenden? Ich haltetry/catch
in einem normalen App-Flow eine schlechte Praxis.Ein Weg ist:
Es ist veraltet und Sie sollten stattdessen den folgenden Code versuchen. Die ersten beiden Codezeilen geben Ihnen die
DisplayMetrics
Objekte an. Dieses Objekt enthält die Felder wieheightPixels
,widthPixels
.quelle
Möglicherweise wird Ihre Frage nicht beantwortet, aber es kann hilfreich sein zu wissen (ich habe selbst danach gesucht, als ich zu dieser Frage kam), dass Sie die Dimension einer Ansicht benötigen, Ihr Code jedoch ausgeführt wird, wenn das Layout noch nicht festgelegt wurde (zum Beispiel in
onCreate()
) Sie können einenViewTreeObserver.OnGlobalLayoutListener
mitView.getViewTreeObserver().addOnGlobalLayoutListener()
einrichten und den entsprechenden Code, der die Dimension der Ansicht benötigt, dort einfügen. Der Rückruf des Hörers wird aufgerufen, wenn das Layout angelegt wurde.quelle
View.post()
es nicht garantiert funktioniert? Ich bin neugierig, weil ich mich auch auf diese Methode verlasse, um die Größe einer Ansicht nach dem Layout zu ermitteln, und nicht wusste, dass sie unzuverlässig ist.View
,ViewTreeObserver
von wem du das bekommst ? Oder teilen sie alle dasselbe?(Antwort 2012, möglicherweise veraltet) Wenn Sie Pre Honeycomb unterstützen möchten, müssen Sie vor API 13 die Abwärtskompatibilität aktivieren. So etwas wie:
Natürlich werden die veralteten Methoden irgendwann aus den neuesten SDKs entfernt, aber obwohl wir uns immer noch darauf verlassen, dass die meisten unserer Benutzer Android 2.1, 2.2 und 2.3 haben, bleibt uns dies übrig.
quelle
Ich habe alle möglichen "Lösungen" erfolglos ausprobiert und festgestellt, dass die "Dalvik Explorer" -App von Elliott Hughes auf jeder Android-Geräte- / Betriebssystemversion immer die richtige Dimension anzeigt. Am Ende habe ich mir sein Open Source-Projekt angesehen, das hier zu finden ist: https://code.google.com/p/enh/
Hier ist der gesamte relevante Code:
BEARBEITEN: leicht verbesserte Version (vermeiden Sie das Auslösen von Ausnahmen bei nicht unterstützten Betriebssystemversionen):
quelle
Einfachster Weg:
quelle
Für den Zugriff auf die Höhe der Statusleiste für Android-Geräte bevorzugen wir eine programmgesteuerte Methode, um diese zu erhalten:
Beispielcode
Die Variable
result
gibt die Höhe im Pixel an.Für einen schnellen Zugriff
Weitere Informationen über die Höhe
Title bar
,Navigation bar
undContent View
, kindly Blick auf Android Geräten Bildschirmgrößen .quelle
getResources().getDisplayMetrics().heightPixels + result
gibt die tatsächliche Vollbildhöhe an. Die Antwort von Dragan Marjanović funktioniert auch, aber ich bevorzuge diese viel kürzere und einfachere Lösung.OnApplyWindowInsetsListener
.Holen
findViewById()
Sie sich zuerst die Ansicht (z. B. von ) und verwenden Sie dann getWidth () für die Ansicht selbst.quelle
Ich habe zwei Funktionen, eine zum Senden des Kontexts und die andere zum Abrufen von Höhe und Breite in Pixel:
und
quelle
@SuppressLint("NewApi")
direkt über der Funktionssignatur hinzufügen , um kompilieren zu können.Für die dynamische Skalierung mit XML gibt es ein Attribut namens "android: layout_weight".
Das folgende Beispiel, das gegenüber der Antwort von synic in diesem Thread geändert wurde , zeigt eine Schaltfläche, die 75% des Bildschirms einnimmt (Gewicht = 0,25), und eine Textansicht , die die restlichen 25% des Bildschirms einnimmt (Gewicht = 0,75).
quelle
Dies ist der Code, den ich für die Aufgabe verwende:
Scheint sauber genug und kümmert sich dennoch um die Abwertung.
quelle
Ist das nicht eine viel bessere Lösung? DisplayMetrics enthält alles, was Sie benötigen, und funktioniert über API 1.
Mit getRealMetrics können Sie auch die tatsächliche Anzeige (einschließlich Bildschirmdekore wie Statusleiste oder Software-Navigationsleiste) abrufen , dies funktioniert jedoch nur bei 17+.
Vermisse ich etwas
quelle
Ich füge nur Francescos Antwort hinzu. Der andere Beobachter, der besser geeignet ist, wenn Sie den Ort im Fenster oder den Ort auf dem Bildschirm herausfinden möchten, ist ViewTreeObserver.OnPreDrawListener ()
Dies kann auch verwendet werden, um andere Attribute einer Ansicht zu finden, die zum Zeitpunkt von onCreate () größtenteils unbekannt sind, z. B. die gescrollte Position, die skalierte Position.
quelle
Verwenden Sie den folgenden Code in Aktivität.
quelle
Finden Sie die Breite und Höhe des Bildschirms:
Auf diese Weise können wir das neueste und höhere SDK 13 erhalten.
quelle
quelle
Ich fand, dass dies den Trick tat.
quelle
Sie müssen sagen, dass Sie keine Verwendung benötigen , wenn Sie nicht in
Activity
, aber inView
(oder eine Variable vomView
Typ in Ihrem Bereich) sindWINDOW_SERVICE
. Dann können Sie mindestens zwei Möglichkeiten verwenden.Zuerst:
Zweite:
Alle diese Methoden, die wir hier aufrufen, sind nicht veraltet.
quelle
quelle
Verwenden Sie zum Abrufen der Bildschirmabmessungen Anzeigemetriken
Holen Sie sich die Höhe und Breite in Pixel
quelle
Dies ist keine Antwort für das OP, da er die Anzeigeabmessungen in echten Pixeln haben wollte. Ich wollte die Abmessungen in "geräteunabhängigen Pixeln" und habe Antworten von hier https://stackoverflow.com/a/17880012/253938 und hier https://stackoverflow.com/a/6656774/253938 zusammengestellt mit diesem:
quelle
Sie können die tun bekommen Höhe Größe:
und die Breite Größe mit
quelle
Es gibt eine nicht veraltete Möglichkeit, dies mit DisplayMetrics (API 1) zu tun, um die Unordnung beim Ausprobieren zu vermeiden:
quelle
Ich würde den getSize-Code folgendermaßen umschließen:
quelle
Für die für die Suche nutzbar Bildschirm Dimension ohne Statusleiste und Aktionsleiste (auch dank Swapnil Antwort):
quelle
Laden Sie zuerst die XML-Datei und schreiben Sie dann diesen Code:
Zeigen Sie Breite und Höhe entsprechend Ihrer Bildschirmauflösung an.
quelle
Befolgen Sie die folgenden Methoden:
quelle
Kotlin
quelle
Es gibt Zeiten, in denen Sie die genauen Abmessungen des verfügbaren Platzes für ein Layout in onCreate einer Aktivität kennen müssen. Nach einigem Überlegen habe ich es so ausgearbeitet.
Wenn Sie dem Android-Manifest aus irgendeinem Grund keine weitere Aktivität hinzufügen möchten, können Sie dies folgendermaßen tun:
quelle
Wenn Sie den Overhead von WindowManagern, Punkten oder Anzeigen nicht möchten, können Sie die Höhen- und Breitenattribute des obersten Ansichtselements in Ihrer XML-Datei abrufen, sofern Höhe und Breite auf match_parent festgelegt sind. (Dies gilt, solange Ihr Layout den gesamten Bildschirm einnimmt.)
Wenn Ihr XML beispielsweise mit Folgendes beginnt:
Dann
findViewById(R.id.entireLayout).getWidth()
wird die Bildschirmbreite undfindViewById(R.id.entireLayout).getHeight()
die Bildschirmhöhe zurückgegeben.quelle