Füllen Sie die Ansicht programmgesteuert auf


235

Ich entwickle Android v2.2 App.

Ich habe ein Fragment .

Beim onCreateView(...)Rückruf meiner Fragmentklasse füge ich dem Fragment ein Layout wie folgt hinzu:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.login, null);

    return view;
}

Die oben aufgeblasene Layoutdatei lautet (login.xml):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" 
 >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Username" />


    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Username" />

</LinearLayout>

Ich möchte ein paddingTopauf das obige <LinearLayout>Element setzen, und ich möchte es im Java- Code tun, anstatt es in XML zu tun.

Wie stellt man paddingTopauf <LinearLayout>in meinem Fragment Java - Klasse Code ??


2
Sie müssen Ihrem LinearLayout eine ID zuweisen, damit Sie sie finden findViewByIdund dann aufrufen setPaddingkönnen.
Aleks G

@AleksG Im Allgemeinen ja, aber da das LinearLayout das Stammelement der aufgeblasenen Hierarchie ist, ist dies hier nicht erforderlich. viewist bereits das LinearLayout, in diesem Fall muss es nicht erneut gefunden werden. Angesichts dessen ist dies jedoch etwas Besonderes.

1
@alextsc: Ja, stimme zu. Trotzdem ziehe ich es vor, IDs für alles zuzuweisen, auf das ich mich in der Anwendung beziehen kann.
Aleks G

Antworten:


485

view.setPadding(0,padding,0,0);

Dadurch wird die obere Polsterung auf padding-pixel gesetzt.

Wenn Sie es dpstattdessen einstellen möchten , können Sie eine Konvertierung durchführen :

float scale = getResources().getDisplayMetrics().density;
int dpAsPixels = (int) (sizeInDp*scale + 0.5f);

6
@ Leem.fin wie Chris sagt, es sind Pixel. Wenn Sie dp wollen, müssen Sie die Konvertierung manuell durchführen:float scale = getResources().getDisplayMetrics().density; int size = (int) (sizeInPx*scale + 0.5f);
Jave

7
Woher kommt der 0.5f?
Herr von Wurst

11
@Georg Dieser Code stammt von hier: developer.android.com/guide/practices/… Die 0,5 wird verwendet, um beim Casting die nächste Ganzzahl zu erhalten (anstatt Math.round () zu verwenden)
Jave

Ich denke, die Variablennamen sollten umgekehrt sein: Ist sizeInDpeigentlich die Anzahl der Pixel, die Sie beim Konvertieren von sizeInPxdps erhalten.
Friederbluemle

98

So beantworten Sie Ihre zweite Frage:

view.setPadding(0,padding,0,0);

Wie von SpK und Jave vorgeschlagen, wird die Auffüllung in Pixel festgelegt. Sie können es in dp einstellen, indem Sie den dp-Wert wie folgt berechnen:

int paddingDp = 25;
float density = context.getResources().getDisplayMetrics().density
int paddingPixel = (int)(paddingDp * density);
view.setPadding(0,paddingPixel,0,0);

Hoffentlich hilft das!


3
Natürlich wird dies wie erwartet kompiliert und funktioniert, aber aus Gründen der Klarheit sollten Sie die Benennung Ihrer int-Variablen ändern. Weil Sie Ihre Auffüllung in DP definieren und berechnen, was es für dieses bestimmte Gerät in Pixel sein würde.
Glenn85

Sie konvertieren dp in Pixel. Die Variablennamen sind verwirrend. "paddingPixel" bedeutet wirklich
dp

92

Wenn Sie das Auffüllen in Ressourcendateien speichern, können Sie einfach aufrufen

int padding = getResources().getDimensionPixelOffset(R.dimen.padding);

Es macht die Konvertierung für Sie.




9

Die Verwendung TypedValueist eine viel sauberere Methode zum Konvertieren in Pixel im Vergleich zur manuellen Berechnung:

float paddingDp = 10f;
// Convert to pixels
int paddingPx = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, paddingDp, context.getResources().getDisplayMetrics());
view.setPadding(paddingPx, paddingPx, paddingPx, paddingPx);

TypedValue.applyDimensionKonvertiert im Wesentlichen die gewünschte Auffüllung entsprechend den Anzeigeeigenschaften des aktuellen Geräts in Pixel.

Weitere Informationen finden Sie unter: TypedValue.applyDimension Docs .


1
sollten px und dp nicht umgekehrt werden?
chris838

Ich denke, der Kern meiner Arbeit ist richtig. Die Benennung ist jedoch verwirrend, denke ich. Ich werde es bearbeiten, um klarer zu sein. Danke für die Rückmeldung.
i2097i

7

Verwenden Sie die folgende Methode, um das Auffüllen dynamisch einzustellen

setPadding(int left, int top, int right, int bottom)

Beispiel:

view.setPadding(2,2,2,2);

3

Schreiben Sie den folgenden Code, um die Polsterung festzulegen. Dies kann Ihnen helfen.

TextView ApplyPaddingTextView = (TextView)findViewById(R.id.textView1);
final LayoutParams layoutparams = (RelativeLayout.LayoutParams) ApplyPaddingTextView.getLayoutParams();

layoutparams.setPadding(50,50,50,50);

ApplyPaddingTextView.setLayoutParams(layoutparams);

Verwenden Sie LinearLayout.LayoutParamsoder RelativeLayout.LayoutParamsentsprechend dem übergeordneten Layout der untergeordneten Ansicht


setPadding () ist keine über LayoutParams zugängliche Methode. Ich bin mir nicht sicher, ob es jemals war.
Sriram

2
Context contect=MainActivity.this;
TextView tview=new TextView(context);
tview.setPaddingRelative(10,0,0,0);

4
Vielen Dank für dieses Code-Snippet, das möglicherweise nur begrenzte und sofortige Hilfe bietet. Eine richtige Erklärung würde ihren langfristigen Wert erheblich verbessern, indem sie zeigt, warum dies eine gute Lösung für das Problem ist, und es für zukünftige Leser mit anderen, ähnlichen Fragen nützlicher machen. Bitte bearbeiten Sie Ihre Antwort, um eine Erklärung hinzuzufügen, einschließlich der von Ihnen getroffenen Annahmen.
Steinbock

0

Konvertieren Sie beim programmgesteuerten Auffüllen in dichtebezogene Werte, indem Sie Pixel in Dp konvertieren.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.