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 ??


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

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!


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.




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 .


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

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


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

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.