Wie lege ich einen Rahmen um eine Android TextView?

Lesezeit: 10 Minuten

Benutzer-Avatar
Yamspog

Ist es möglich, einen Rahmen um ein Android zu ziehen? TextView?

  • Ich habe hier eine schmutzige Lösung gepostet: stackoverflow.com/a/45242147/4291937

    – Gregor Azbe

    21. Juli 2017 um 16:09 Uhr

  • Schauen Sie sich meine einzeilige Antwort unten an.

    – Vielfältig

    21. April 2018 um 13:54 Uhr

  • Mit dem Materialkomponenten benutze einfach a MaterialShapeDrawable : stackoverflow.com/questions/18781902/…

    – Gabriele Mariotti

    7. August 2020 um 8:40 Uhr

Benutzer-Avatar
Konstantin Burow

Sie können eine zeichbare Form (ein Rechteck) als Hintergrund für die Ansicht festlegen.

<TextView android:text="Some text" android:background="@drawable/back"/>

Und Rectangle drawable back.xml (im Ordner res/drawable abgelegt):

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
   <solid android:color="@android:color/white" />
   <stroke android:width="1dip" android:color="#4fa5d5"/>
</shape>

Sie können verwenden @android:color/transparent damit die Volltonfarbe einen transparenten Hintergrund hat. Sie können auch Padding verwenden, um den Text vom Rahmen zu trennen. Weitere Informationen finden Sie unter: http://developer.android.com/guide/topics/resources/drawable-resource.html

  • Was ist, wenn ich nur den oberen Rand haben möchte?

    – happyhardik

    1. August 2012 um 17:55 Uhr

  • @whyoz Seine Methode fügt der Ansichtshierarchie unnötige Komplexität hinzu. Sie benötigen zwei zusätzliche Ansichten (einen Layout-Container und die Rahmenansicht), um diese Methode zu verwenden. Wenn Sie also viele Ansichten haben, denen Sie einen Rahmen hinzufügen müssen, wird Ihr Ansichtsbaum unüberschaubar.

    – Konstantin Burov

    28. März 2013 um 15:23 Uhr

  • @whyoz dennoch kann diese Methode über Stile und Themen angewendet werden, während die Methode von YongGu nicht auf diese Weise verwendet werden kann.

    – Konstantin Burov

    28. März 2013 um 15:25 Uhr

  • Für nur obere Grenzesiehe diese Frage.

    – Schmerz

    7. April 2014 um 3:01 Uhr

  • Sie können dieses Werkzeug verwenden http://shapes.softartstudio.com Drawables zu generieren.

    – Arda Basoglu

    17. November 2015 um 23:55 Uhr


Benutzer-Avatar
Suragch

Lassen Sie mich einige verschiedene (nicht-programmatische) Methoden zusammenfassen.

Verwenden einer Form, die gezeichnet werden kann

Speichern Sie Folgendes als XML-Datei in Ihrem Drawable-Ordner (z. B. my_border.xml):

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

    <!-- View background color -->
    <solid
        android:color="@color/background_color" >
    </solid>

    <!-- View border color and width -->
    <stroke
        android:width="1dp"
        android:color="@color/border_color" >
    </stroke>

    <!-- The radius makes the corners rounded -->
    <corners
        android:radius="2dp"   >
    </corners>

</shape>

Dann legen Sie es einfach als Hintergrund für Ihre TextView fest:

<TextView
    android:id="@+id/textview1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/my_border" />

Mehr Hilfe:

Mit einem 9-Patch

Ein 9-Patch ist ein dehnbares Hintergrundbild. Wenn Sie ein Bild mit einem Rand erstellen, erhält Ihre TextView einen Rand. Alles, was Sie tun müssen, ist, das Bild zu erstellen und es dann in Ihrer Textansicht in den Hintergrund zu stellen.

<TextView
    android:id="@+id/textview1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/my_ninepatch_image" />

Hier sind einige Links, die zeigen, wie man ein 9-Patch-Bild erstellt:

Was ist, wenn ich nur den oberen Rand haben möchte?

Verwendung einer Layer-Liste

Sie können eine Ebenenliste verwenden, um zwei Rechtecke übereinander zu stapeln. Indem Sie das zweite Rechteck etwas kleiner als das erste Rechteck machen, können Sie einen Randeffekt erzielen. Das erste (untere) Rechteck ist die Randfarbe und das zweite Rechteck ist die Hintergrundfarbe.

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- Lower rectangle (border color) -->
    <item>
        <shape android:shape="rectangle">
            <solid android:color="@color/border_color" />
        </shape>
    </item>

    <!-- Upper rectangle (background color) -->
    <item android:top="2dp">
        <shape android:shape="rectangle">
            <solid android:color="@color/background_color" />
        </shape>
    </item>
</layer-list>

Einstellung android:top="2dp" versetzt die Spitze (macht sie kleiner) um 2 dp. Dadurch kann das erste (untere) Rechteck durchscheinen, was einen Randeffekt ergibt. Sie können dies auf die gleiche Weise wie die auf den TextView-Hintergrund anwenden shape drawable wurde oben getan.

Hier sind einige weitere Links zu Ebenenlisten:

  • Die von Android verstehen
  • Wie erstelle ich einen unteren Rand in einem zeichbaren XML-Selektor?
  • Erstellen Sie Ränder in einer Android-Ansicht in drawable xml auf 3 Seiten?

Mit einem 9-Patch

Sie können einfach ein 9-Patch-Bild mit einem einzelnen Rahmen erstellen. Alles andere ist wie oben beschrieben.

Verwenden einer Ansicht

Dies ist eine Art Trick, aber es funktioniert gut, wenn Sie ein Trennzeichen zwischen zwei Ansichten oder einen Rahmen zu einer einzelnen TextView hinzufügen müssen.

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textview1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <!-- This adds a border between the TextViews -->
    <View
        android:layout_width="match_parent"
        android:layout_height="2dp"
        android:background="@android:color/black" />

    <TextView
        android:id="@+id/textview2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

Hier noch ein paar Links:

  • So zeichnen Sie eine Linie in Android
  • So platzieren Sie eine horizontale Trennlinie zwischen Bearbeitungstexten in einer Aktivität
  • Wie füge ich in einem relativen Layout eine horizontale 1px-Linie über der Bildansicht hinzu?

  • Meine Güte, Mann, a border: 1px solid #999; soll nicht sein diese kompliziert.

    – Achschar

    2. Februar 2018 um 23:51 Uhr

  • Was ist, wenn ich den Rand der Textansicht haben möchte, der auch einen Schatten- und Welleneffekt hat?

    – Akash Dubey

    16. März 2018 um 6:47 Uhr

  • @AkashDubey, Entschuldigung, das habe ich noch nie gemacht. Ich schlage vor, Sie probieren sie einzeln aus und kombinieren sie dann. Wenn Sie nicht weiterkommen, stellen Sie eine neue Frage zu Stack Overflow.

    – Suragch

    16. März 2018 um 7:44 Uhr

Benutzer-Avatar
Junge Gu

Der einfache Weg ist, eine Ansicht für Ihre TextView hinzuzufügen. Beispiel für die untere Begrenzungslinie:

<LinearLayout android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent">
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="10dp"
        android:text="@string/title"
        android:id="@+id/title_label"
        android:gravity="center_vertical"/>
    <View
        android:layout_width="fill_parent"
        android:layout_height="0.2dp"
        android:id="@+id/separator"
        android:visibility="visible"
        android:background="@android:color/darker_gray"/>

</LinearLayout>

Für die anderen Richtungsgrenzen passen Sie bitte die Position der Trennansicht an.

  • Nach meiner Erfahrung hat diese Lösung auf alten Geräten einen leisen sichtbaren Einfluss auf die App-Performance.

    – Roberto Lombardini

    23. September 2013 um 13:16 Uhr

  • Dies ist aus Sicht der Inflation eine schreckliche Lösung. Sie erstellen 3 neue Ansichtselemente und fügen eine weitere Ebene in der Tiefe der Ansichtshierarchie hinzu

    – Philipp

    15. November 2013 um 23:26 Uhr

  • Schlechteste Lösung wegen Inflationsperspektive wie Philipp sagte. Wissen Sie, dass TextView ein spezielles XML-Tag hat, um genau das zu tun: Definieren Sie ein Bild, das links/rechts/oben/unten um Ihre TextView gezeichnet werden soll, und sie sind bekannt als android:drawable****

    – Mathias Seguy Android2ee

    2. Dezember 2016 um 11:06 Uhr

Ich habe dieses Problem gelöst, indem ich die Textansicht erweitert und manuell einen Rahmen gezogen habe. Ich habe sogar hinzugefügt, dass Sie auswählen können, ob ein Rand gepunktet oder gestrichelt ist.

public class BorderedTextView extends TextView {
        private Paint paint = new Paint();
        public static final int BORDER_TOP = 0x00000001;
        public static final int BORDER_RIGHT = 0x00000002;
        public static final int BORDER_BOTTOM = 0x00000004;
        public static final int BORDER_LEFT = 0x00000008;

        private Border[] borders;

        public BorderedTextView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            init();
        }

        public BorderedTextView(Context context, AttributeSet attrs) {
            super(context, attrs);
            init();
        }

        public BorderedTextView(Context context) {
            super(context);
            init();
        }
        private void init(){
            paint.setStyle(Paint.Style.STROKE);
            paint.setColor(Color.BLACK);
            paint.setStrokeWidth(4);        
        }
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            if(borders == null) return;

            for(Border border : borders){
                paint.setColor(border.getColor());
                paint.setStrokeWidth(border.getWidth());

                if(border.getStyle() == BORDER_TOP){
                    canvas.drawLine(0, 0, getWidth(), 0, paint);                
                } else
                if(border.getStyle() == BORDER_RIGHT){
                    canvas.drawLine(getWidth(), 0, getWidth(), getHeight(), paint);
                } else
                if(border.getStyle() == BORDER_BOTTOM){
                    canvas.drawLine(0, getHeight(), getWidth(), getHeight(), paint);
                } else
                if(border.getStyle() == BORDER_LEFT){
                    canvas.drawLine(0, 0, 0, getHeight(), paint);
                }
            }
        }

        public Border[] getBorders() {
            return borders;
        }

        public void setBorders(Border[] borders) {
            this.borders = borders;
        }
}

Und die Grenzklasse:

public class Border {
    private int orientation;
    private int width;
    private int color = Color.BLACK;
    private int style;
    public int getWidth() {
        return width;
    }
    public void setWidth(int width) {
        this.width = width;
    }
    public int getColor() {
        return color;
    }
    public void setColor(int color) {
        this.color = color;
    }
    public int getStyle() {
        return style;
    }
    public void setStyle(int style) {
        this.style = style;
    }
    public int getOrientation() {
        return orientation;
    }
    public void setOrientation(int orientation) {
        this.orientation = orientation;
    }
    public Border(int Style) {
        this.style = Style;
    }
}

Hoffe das hilft jemandem 🙂

Einfachste Lösung, die ich gefunden habe (und die tatsächlich funktioniert):

<TextView
    ...
    android:background="@android:drawable/editbox_background" />

  • Ist es möglich, dies von einem Ort aus auf alle Textansichten anzuwenden?

    – Ian Warburton

    27. Juli 2018 um 18:25 Uhr


  • Schön für einen Quickie. Dies kann aber je nach Version des laufenden Gerätes sehr ungewöhnliche Auswirkungen haben. Das liegt daran, dass Google ständig ändert, wie EditTexts aussehen (du musst in Mode bleiben!)

    – SMBiggs

    1. August 2019 um 16:51 Uhr

  • Ich bin mir nicht sicher, ob dies den Dunkelmodus unterstützt

    – Kishore

    13. März um 11:15 Uhr

Benutzer-Avatar
Peter Mortensen

Sie können den Rahmen auf zwei Arten festlegen. Einer ist per drawable und der zweite ist programmatisch.

Verwenden von Drawable

<shape>
    <solid android:color="@color/txt_white"/>
    <stroke android:width="1dip" android:color="@color/border_gray"/>
    <corners android:bottomLeftRadius="10dp"
             android:bottomRightRadius="0dp"
             android:topLeftRadius="10dp"
             android:topRightRadius="0dp"/>
    <padding android:bottom="0dip"
             android:left="0dip"
             android:right="0dip"
             android:top="0dip"/>
</shape>

Programmatisch


public static GradientDrawable backgroundWithoutBorder(int color) {

    GradientDrawable gdDefault = new GradientDrawable();
    gdDefault.setColor(color);
    gdDefault.setCornerRadii(new float[] { radius, radius, 0, 0, 0, 0,
                                           radius, radius });
    return gdDefault;
}

  • Ist es möglich, dies von einem Ort aus auf alle Textansichten anzuwenden?

    – Ian Warburton

    27. Juli 2018 um 18:25 Uhr


  • Schön für einen Quickie. Dies kann aber je nach Version des laufenden Gerätes sehr ungewöhnliche Auswirkungen haben. Das liegt daran, dass Google ständig ändert, wie EditTexts aussehen (du musst in Mode bleiben!)

    – SMBiggs

    1. August 2019 um 16:51 Uhr

  • Ich bin mir nicht sicher, ob dies den Dunkelmodus unterstützt

    – Kishore

    13. März um 11:15 Uhr

Benutzer-Avatar
Markus Bernstein

Ich habe mir gerade eine ähnliche Antwort angesehen – dies kann mit einem Schlaganfall und der folgenden Überschreibung erfolgen:

@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {

Paint strokePaint = new Paint();
strokePaint.setARGB(255, 0, 0, 0);
strokePaint.setTextAlign(Paint.Align.CENTER);
strokePaint.setTextSize(16);
strokePaint.setTypeface(Typeface.DEFAULT_BOLD);
strokePaint.setStyle(Paint.Style.STROKE);
strokePaint.setStrokeWidth(2);

Paint textPaint = new Paint();
textPaint.setARGB(255, 255, 255, 255);
textPaint.setTextAlign(Paint.Align.CENTER);
textPaint.setTextSize(16);
textPaint.setTypeface(Typeface.DEFAULT_BOLD);

canvas.drawText("Some Text", 100, 100, strokePaint);
canvas.drawText("Some Text", 100, 100, textPaint);

super.draw(canvas, mapView, shadow); 
}

  • Toll! Meine einzige Sorge ist, dass der Strich an den Ecken hässlich ist, wenn ich drawRoundRect verwende, sowohl auf dem Telefon als auch im Emulator.

    – Erdomester

    15. Mai 2012 um 21:40 Uhr

  • @erdomester Vielleicht Paint StrokePaint = new Paint (Paint.ANTI_ALIAS_FLAG); wird das Problem “hässlich an den Ecken” lösen

    – P-RAD

    18. September 2015 um 0:05 Uhr


1014130cookie-checkWie lege ich einen Rahmen um eine Android TextView?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy