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


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

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!


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ê.




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 .


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

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


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

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.