Aggiungi imbottitura in vista a livello di programmazione


235

Sto sviluppando l'app Android v2.2.

Ho un frammento .

Nel onCreateView(...)callback della mia classe di frammento, gonfio un layout al frammento come di seguito:

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

    return view;
}

Il file di layout gonfiato sopra è (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>

Vorrei impostare un elemento paddingTopsopra <LinearLayout>, e voglio farlo nel codice Java invece di farlo in XML.

Come impostare paddingTopa <LinearLayout>mio frammento di codice Java di classe ??


2
Dovrai assegnare un ID al tuo LinearLayout in modo che tu possa trovarlo findViewByIde quindi chiamarlo setPadding.
Aleks G

@AleksG In generale sì, ma dato che LinearLayout è l'elemento radice della gerarchia gonfiata che non è necessario qui. viewè già LinearLayout, non è necessario trovarlo di nuovo in questo caso. Dato questo è speciale però.

1
@alextsc: sì, d'accordo. Tuttavia, preferisco ancora assegnare gli ID a tutto ciò a cui posso fare riferimento nell'applicazione.
Aleks G

Risposte:


486

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

Questo imposterà l'imbottitura superiore su padding-pixel.

Se invece vuoi impostarlo dp, puoi fare una conversione :

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

6
@ Leem.fin come dice Chris, sono pixel. Se vuoi dp dovrai fare la conversione manualmente:float scale = getResources().getDisplayMetrics().density; int size = (int) (sizeInPx*scale + 0.5f);
Jave

7
Da dove viene lo 0.5f?
Herr von Wurst,

11
@Georg Quel codice è preso da qui: developer.android.com/guide/practices/… Lo 0,5 è usato per ottenere il numero intero più vicino durante il casting (invece di usare Math.round ())
Jave,

Penso che i nomi delle variabili dovrebbero essere al contrario: in sizeInDprealtà è il numero di pixel che ottieni quando converti sizeInPxdps.
friederbluemle,

99

Per rispondere alla tua seconda domanda:

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

come suggerito da SpK e Jave, imposterà il riempimento in pixel. Puoi impostarlo in dp calcolando il valore dp come segue:

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

Spero che aiuti!


3
Ovviamente questo verrà compilato e funzionerà come previsto, ma per motivi di chiarezza dovresti cambiare la denominazione delle variabili int. Perché definisci il tuo riempimento in DP e calcoli quale sarebbe in pixel per questo dato dispositivo.
Glenn85,

Stai convertendo dp in pixel. I nomi delle variabili sono confusi. "paddingPixel" significa davvero dp
Jiechao Wang,

92

Se memorizzi il riempimento in file di risorse, puoi semplicemente chiamare

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

Fa la conversione per te.




9

L'utilizzo TypedValueè un modo molto più semplice di convertire in pixel rispetto al calcolo manuale:

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);

In sostanza, TypedValue.applyDimensionconverte l'imbottitura desiderata in pixel in modo appropriato a seconda delle proprietà di visualizzazione del dispositivo corrente.

Per ulteriori informazioni, consultare: TypedValue.applyDimension Docs .


1
px e dp non dovrebbero essere invertiti?
chris838,

Penso che l'essenza di ciò che sto facendo sia corretta. Comunque la denominazione è confusa, penso. Lo modificherò per essere più chiaro. Grazie per il feedback.
i2097i,

7

utilizzare il metodo seguente per impostare in modo dinamico il riempimento

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

Esempio :

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

3

Scrivi il seguente codice per impostare il riempimento, potrebbe esserti di aiuto.

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

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

ApplyPaddingTextView.setLayoutParams(layoutparams);

Utilizzare LinearLayout.LayoutParamso in RelativeLayout.LayoutParamsbase al layout principale della vista figlio


setPadding () non è un metodo accessibile da LayoutParams. Non sono sicuro che sia mai stato.
Sriram,

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

4
Grazie per questo frammento di codice, che potrebbe fornire un aiuto limitato e immediato. Una spiegazione adeguata migliorerebbe notevolmente il suo valore a lungo termine mostrando perché questa è una buona soluzione al problema e la renderebbe più utile ai futuri lettori con altre domande simili. Si prega di modificare la risposta di aggiungere qualche spiegazione, tra le ipotesi che hai fatto.
Capricorno,

0

Durante il riempimento a livello di codice, converti in valori relativi alla densità convertendo pixel in Dp.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.