Ich habe dieses Problem in meinen Ansichten EditText
und Button
Ansichten, in denen ich eine schöne Polsterung habe, damit sie vom Text entfernt bleiben , aber wenn ich den Hintergrund mit ändere setBackgroundDrawable
oder setBackgroundResource
diese Polsterung für immer verloren geht.
86
TextView
und die unten akzeptierte Lösung funktionierte auch für diese Art von Ansicht.TextView
API 28 (Android 9) auf. Sieht so aus, als wäre es nie behoben worden.Antworten:
Was ich fand, war das Hinzufügen eines 9-Patches als Hintergrundressource, um das Auffüllen zurückzusetzen - obwohl es interessanterweise nicht so war, wenn ich ein Farb- oder Nicht-9-Patch-Bild hinzufügte. Die Lösung bestand darin, die Füllwerte zu speichern, bevor der Hintergrund hinzugefügt wird, und sie anschließend erneut festzulegen.
quelle
Ich konnte das Element in ein anderes Layout einbinden, in diesem Fall a
FrameLayout
. Dadurch konnte ich den Hintergrund auf dem ändern,FrameLayout
ohne die Polsterung zu zerstören, die sich auf dem enthaltenen befindetRelativeLayout
.Die andere Möglichkeit besteht darin, es programmgesteuert einzustellen, nachdem der Hintergrund
Drawable
wie oben vorgeschlagen eingestellt wurde. Stellen Sie einfach sicher, dass Sie die Pixel berechnen, um die Auflösung des Geräts zu korrigieren.quelle
Ich hatte dieses Problem in einer TextView, also habe ich TextView untergeordnet und eine Override-Methode für die
TextView.setBackgroundResource(int resid)
Methode erstellt. So was:Auf diese Weise wird das Auffüllen des Elements abgerufen, bevor die Ressource festgelegt wird, es wird jedoch nicht die ursprüngliche Funktionalität der Methode beeinträchtigt, außer dass das Auffüllen beibehalten wird.
quelle
Ich habe das noch nicht sehr gründlich getestet, aber diese Methode könnte von Nutzen sein:
Verwenden Sie dies anstelle von view.setBackgroundDrawable (Drawable).
quelle
Abwärtskompatible Version der Antwort von CottonBallPaws
quelle
Sie können einige Auffüllungen vornehmen, indem Sie 9-Patch-Bilder verwenden und den Inhaltsbereich im Zeichenbildschirm definieren. Überprüfen Sie dies
Sie können die Auffüllung in Ihrem Layout auch über XML oder programmgesteuert festlegen
XML-Padding-Tags
Sie können versuchen, die Auffüllung manuell über den Code festzulegen, nachdem Sie setBackgroundDrawable aufgerufen haben, indem Sie setPadding in Ihrer EditText- oder Schaltflächenansicht aufrufen
quelle
Für gewöhnliche Sucher,
Fügen Sie einfach setPadding nach setBackgroudDrawable hinzu. Wenn Sie Ihr Drawable ändern, müssen Sie setPadding erneut aufrufen.
Mögen:
Am saubersten ist es, Ihre Auffüllungen in einer XML-Zeichendatei zu definieren, die auf die Zeichenbilddatei verweist
Greatings
quelle
Meine Lösung bestand darin, die Ansicht zu erweitern (in meinem Fall eine EditText ) zu erweitern und zu überschreiben
setBackgroundDrawable()
undsetBackgroundResource()
Methoden:quelle
Ich kombinierte die Lösungen aller und schrieb eine in Kotlin:
quelle
Nur um zu erklären, was passiert:
Es ist eigentlich eine Funktion. Layout-Zeichen, die Sie als Hintergrund verwenden können, können eine Auffüllung folgendermaßen definieren:
Diese Polsterung wird zusammen mit dem neuen zeichnbaren Hintergrund festgelegt. Wenn keine Auffüllung vorhanden ist, ist der Standardwert 0.
Weitere Informationen aus einer E-Mail von Romain Guy: https://www.mail-archive.com/[email protected]/msg09595.html
quelle
ändere lib in v7: 22.1.0 in android studio wie folgt kompiliere 'com.android.support:appcompat-v7:22.1.0'
quelle
Die meisten Antworten sind korrekt, sollten jedoch die Hintergrundeinstellung korrekt verarbeiten.
Holen Sie sich zuerst die Auffüllung Ihrer Ansicht
Stellen Sie dann den Hintergrund ein
Stellen Sie dann die Auffüllung ein, die die Ansicht vor dem Hintergrundwechsel hatte
quelle
Ich habe eine andere Lösung gefunden. Ich hatte ein ähnliches Problem mit Buttons. Schließlich fügte ich hinzu:
es hat bei mir funktioniert. Die Standardauffüllung ist fast gleich.
quelle
In meinem Fall hatte ich ein Drawable und war so dumm, dass ich nicht sah, dass die Auffüllungen in der XML alle auf 0 gesetzt waren.
quelle
Hier eine verbesserte Version von CottonBallPaws 'setBackgroundAndKeepPadding. Dadurch bleibt die Auffüllung erhalten, auch wenn Sie die Methode mehrmals aufrufen:
Sie müssen eine Ressourcen-ID über values / ids.xml definieren:
quelle
Ich benutze diese ziemlich einfache Problemumgehung, die ich unten
accentColor
in meinemstyle.xml
Like definiereund dann verwende ich einen der folgenden Stile in meinen
Button
Tagszum Beispiel :
quelle