Adicionar preenchimento na exibição programaticamente

235

Estou desenvolvendo o aplicativo Android v2.2.

Eu tenho um fragmento .

No onCreateView(...)retorno de chamada da minha classe de fragmento, eu inflado um layout para o fragmento como abaixo:

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

    return view;
}

O arquivo de layout inflado acima é (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>

Gostaria de definir um paddingToppara o <LinearLayout>elemento acima e quero fazê-lo no código Java em vez de fazê-lo em xml.

Como definir paddingTopa <LinearLayout>no meu fragmento de código de classe Java ??

Leem.fin
fonte
2
Você precisará atribuir um ID ao seu LinearLayout para encontrá-lo findViewByIde, em seguida, chamá setPadding-lo.
Aleks G
@AleksG Em geral, sim, mas como o LinearLayout é o elemento raiz da hierarquia inflada que não é necessária aqui. viewjá é o LinearLayout, não é necessário encontrá-lo novamente neste caso. Dado que este é um especial embora.
1
@alextsc: sim, concordo. No entanto, ainda prefiro atribuir IDs a qualquer coisa que eu possa me referir no aplicativo.
Aleks G

Respostas:

486

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

Isso definirá o preenchimento superior para padding-pixels.

Se você deseja configurá-lo dp, pode fazer uma conversão :

float scale = getResources().getDisplayMetrics().density;
int dpAsPixels = (int) (sizeInDp*scale + 0.5f);
Jave
fonte
6
@ Leem.fin como Chris diz, são pixels. Se você quiser o dp, terá que fazer a conversão manualmente:float scale = getResources().getDisplayMetrics().density; int size = (int) (sizeInPx*scale + 0.5f);
Jave
7
De onde vem o 0.5f?
Herr von Wurst
11
@Georg Esse código é retirado daqui: developer.android.com/guide/practices/… O 0.5 é usado para obter o número inteiro mais próximo ao transmitir (em vez de usar Math.round ())
Jave
Eu acho que os nomes das variáveis ​​devem ser o contrário: sizeInDpna verdade, é o número de pixels que você obtém ao converter sizeInPxdps.
Friederbluemle
99

Para responder sua segunda pergunta:

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

como SpK e Jave sugeriram, definirá o preenchimento em pixels. Você pode configurá-lo em dp calculando o valor dp da seguinte maneira:

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

Espero que ajude!

Chris Conway
fonte
3
Obviamente, isso irá compilar e funcionar como esperado, mas por uma questão de clareza, você deve mudar o nome de suas variáveis ​​int. Porque você define seu preenchimento no DP e calcula o que seria em pixels para esse dispositivo.
precisa saber é o seguinte
Você está convertendo dp em pixel. Os nomes das variáveis ​​são confusos. "paddingPixel" realmente significa dp
Jiechao Wang 17/11/16
92

Se você armazenar o preenchimento em arquivos de recursos, poderá simplesmente chamar

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

Faz a conversão para você.

Miklos Jakab
fonte
18

Usando o Kotlin e a biblioteca android-ktx, você pode simplesmente fazer

view.updatePadding(top = 42)

Veja os documentos aqui

Andrew Orobator
fonte
15

Você pode definir o preenchimento para sua visualização de forma programática em todo o código abaixo -

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

E também existem diferentes tipos de preenchimento disponíveis -

Preenchimento

PaddingBottom

PaddingLeft

PaddingRight

PaddingTop

Esses links farão referência ao site dos desenvolvedores do Android. Espero que isso ajude muito.

Praveenkumar
fonte
@ Leem.fin Dê uma olhada neste que você poderá saber a diferença.
precisa saber é o seguinte
9

Usar TypedValueé uma maneira muito mais limpa de converter em pixels em comparação com o cálculo manual:

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

Essencialmente, TypedValue.applyDimension converte o preenchimento desejado em pixels adequadamente, dependendo das propriedades de exibição do dispositivo atual.

Para mais informações, consulte: TypedValue.applyDimension Docs .

i2097i
fonte
1
px e dp não devem ser revertidos?
precisa
Eu acho que a essência do que estou fazendo está correta. No entanto, o nome é confuso, eu acho. Vou editá-lo para ficar mais claro. Obrigado pelo feedback.
I2097i
7

use o método abaixo para definir o preenchimento dinamicamente

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

Exemplo:

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

Escreva o código a seguir para definir o preenchimento, isso pode ajudá-lo.

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

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

ApplyPaddingTextView.setLayoutParams(layoutparams);

Use LinearLayout.LayoutParamsou de RelativeLayout.LayoutParamsacordo com o layout pai da visualização filho

Manikandan K
fonte
setPadding () não é um método acessível de LayoutParams. Não tenho certeza se alguma vez foi.
Sriram 26/02
2
Context contect=MainActivity.this;
TextView tview=new TextView(context);
tview.setPaddingRelative(10,0,0,0);
Siddhartha Halder
fonte
4
Obrigado por este trecho de código, que pode fornecer ajuda imediata e limitada. Uma explicação adequada melhoraria bastante seu valor a longo prazo, mostrando por que essa é uma boa solução para o problema e a tornaria mais útil para futuros leitores com outras perguntas semelhantes. Por favor edite sua resposta para adicionar alguma explicação, incluindo as suposições que você fez.
Capricórnio
0

Enquanto estiver preenchendo programaticamente, converta em valores relacionados à densidade convertendo pixel em Dp.

Bhagya
fonte