Ajouter un remplissage sur la vue par programme

235

Je développe l'application Android v2.2.

J'ai un fragment .

Dans le onCreateView(...)rappel de ma classe de fragment, je gonfle une disposition au fragment comme ci-dessous:

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

    return view;
}

Le fichier de disposition gonflé ci-dessus est (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>

Je voudrais mettre un paddingTopà l' <LinearLayout>élément ci-dessus , et je veux le faire dans le code Java au lieu de le faire en xml.

Comment mettre paddingTopà <LinearLayout>mon fragment Java code de classe ??

Leem.fin
la source
2
Vous devrez attribuer un ID à votre LinearLayout afin que vous puissiez le trouver avec findViewById, puis l'appeler setPadding.
Aleks G
@AleksG En général oui, mais étant donné que le LinearLayout est l'élément racine de la hiérarchie gonflée qui n'est pas nécessaire ici. viewest déjà le LinearLayout, pas besoin de le retrouver dans ce cas. Étant donné que c'est un cas particulier.
1
@alextsc: oui, d'accord. Néanmoins, je préfère toujours attribuer des identifiants à tout ce à quoi je pourrais me référer dans la demande.
Aleks G

Réponses:

486

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

Cela définira le remplissage supérieur à padding-pixels.

Si vous souhaitez le configurer à la dpplace, vous pouvez effectuer une conversion :

float scale = getResources().getDisplayMetrics().density;
int dpAsPixels = (int) (sizeInDp*scale + 0.5f);
Jave
la source
6
@ Leem.fin comme le dit Chris, ce sont des pixels. Si vous voulez dp, vous devrez faire la conversion manuellement:float scale = getResources().getDisplayMetrics().density; int size = (int) (sizeInPx*scale + 0.5f);
Jave
7
D'où vient le 0.5f?
Herr von Wurst, le
11
@Georg Ce code est extrait d'ici: developer.android.com/guide/practices/… Le 0,5 est utilisé pour obtenir l'entier le plus proche lors de la conversion (au lieu d'utiliser Math.round ())
Jave
Je pense que les noms de variables devraient être l'inverse: sizeInDpc'est en fait le nombre de pixels que vous obtenez lors de la conversion de sizeInPxdps.
friederbluemle
99

Pour répondre à votre deuxième question:

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

comme SpK et Jave l'ont suggéré, définira le remplissage en pixels. Vous pouvez le définir en dp en calculant la valeur dp comme suit:

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

J'espère que cela pourra aider!

Chris Conway
la source
3
Bien sûr, cela se compilera et fonctionnera comme prévu, mais pour plus de clarté, vous devez changer le nom de vos variables int. Parce que vous définissez votre remplissage en DP et calculez ce qu'il serait en pixels pour cet appareil donné.
Glenn85
Vous convertissez dp en pixel. Les noms de variables prêtent à confusion. "paddingPixel" signifie vraiment dp
Jiechao Wang
92

Si vous stockez le remplissage dans des fichiers de ressources, vous pouvez simplement appeler

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

Il fait la conversion pour vous.

Miklos Jakab
la source
18

En utilisant Kotlin et la bibliothèque android-ktx, vous pouvez simplement faire

view.updatePadding(top = 42)

Voir les documents ici

Andrew Orobator
la source
15

Vous pouvez définir le remplissage de votre vue en programmant tout au long du code ci-dessous -

view.setPadding(0,1,20,3);

Et, il existe également différents types de rembourrage disponibles -

Rembourrage

RembourrageBas

PaddingLeft

PaddingRight

PaddingTop

Ces liens renverront au site des développeurs Android. J'espère que cela vous aide beaucoup.

Praveenkumar
la source
@ Leem.fin Jetez un oeil à celui-ci, vous pourrez faire la différence.
Praveenkumar
9

L'utilisation TypedValueest un moyen beaucoup plus propre de convertir en pixels que de calculer manuellement:

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

Essentiellement, TypedValue.applyDimensionconvertit le remplissage souhaité en pixels en fonction des propriétés d'affichage de l'appareil actuel.

Pour plus d'informations, voir: TypedValue.applyDimension Docs .

i2097i
la source
1
ne devrait-on pas inverser px et dp?
chris838
Je pense que l'essentiel de ce que je fais est correct. Cependant, la dénomination prête à confusion, je pense. Je vais le modifier pour être plus clair. Merci pour les commentaires.
i2097i
7

utiliser la méthode ci-dessous pour définir dynamiquement le remplissage

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

Exemple :

view.setPadding(2,2,2,2);
Sai Gopi N
la source
3

Écrivez le code suivant pour définir le remplissage, cela peut vous aider.

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

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

ApplyPaddingTextView.setLayoutParams(layoutparams);

Utiliser LinearLayout.LayoutParamsou RelativeLayout.LayoutParamsselon la disposition parent de la vue enfant

Manikandan K
la source
setPadding () n'est pas une méthode accessible à partir de LayoutParams. Je ne sais pas si ça l'a jamais été.
Sriram
2
Context contect=MainActivity.this;
TextView tview=new TextView(context);
tview.setPaddingRelative(10,0,0,0);
Siddhartha Halder
la source
4
Merci pour cet extrait de code, qui pourrait fournir une aide limitée et immédiate. Une explication appropriée améliorerait considérablement sa valeur à long terme en montrant pourquoi il s'agit d'une bonne solution au problème et le rendrait plus utile aux futurs lecteurs ayant d'autres questions similaires. Veuillez modifier votre réponse pour ajouter des explications, y compris les hypothèses que vous avez faites.
Capricorne
0

Lors du remplissage par programmation, convertissez-le en valeurs liées à la densité en convertissant le pixel en Dp.

Bhagya
la source