Görünümde programlı dolgu ekleme


235

Android v2.2 uygulamasını geliştiriyorum.

Bir parçam var .

In onCreateView(...)my fragman sınıfın callback'inde, aşağıda gibi fragmanına bir düzen şişirmek:

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

    return view;
}

Yukarıdaki şişirilmiş düzen dosyası (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>

Ben paddingTopyukarıdaki <LinearLayout>öğeye ayarlamak istiyorum ve bunu xml yerine Java kodunda yapmak istiyorum .

Nasıl benim parçası Java sınıf kodu ayarlamak paddingTopiçin <LinearLayout>??


2
LinearLayout'unuza bir kimlik atamanız gerekir, böylece onu bulabilir findViewByIdve daha sonra arayabilirsiniz setPadding.
Aleks G

@AleksG Genel olarak evet, ancak LinearLayout'un, burada gerekli olmayan şişirilmiş hiyerarşinin kök öğesi olduğu göz önüne alındığında. viewzaten LinearLayout, bu durumda tekrar bulmanıza gerek yok. Verilen bu özel bir olsa.

1
@alextsc: evet, katılıyorum. Yine de, uygulamada başvurabileceğim herhangi bir şeye kimlik atamayı tercih ediyorum.
Aleks G

Yanıtlar:


486

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

Bu, üst dolguyu padding-piksel olarak ayarlayacaktır.

dpBunun yerine ayarlamak istiyorsanız, bir dönüşüm yapabilirsiniz :

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

6
@ Leem.fin, Chris'in dediği gibi, piksel. Dp istiyorsanız, dönüşümü manuel olarak yapmanız gerekir:float scale = getResources().getDisplayMetrics().density; int size = (int) (sizeInPx*scale + 0.5f);
Jave

7
0.5f nereden geliyor?
Herr von Wurst

11
@Georg Bu kod buradan alınır: developer.android.com/guide/practices/… 0.5, yayın yaparken en yakın tamsayıyı elde etmek için kullanılır (Math.round () yerine)
Jave

Değişken isimleri başka bir şekilde olması gerektiğini düşünüyorum: sizeInDpaslında sizeInPxdps dönüştürürken olsun piksel sayısı .
friederbluemle

99

İkinci sorunuza cevap vermek için:

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

SpK ve Jave gibi önerilen dolgu, piksel olarak ayarlar. Dp değerini aşağıdaki gibi hesaplayarak dp olarak ayarlayabilirsiniz:

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

Umarım yardımcı olur!


3
Elbette bu beklendiği gibi derlenecek ve çalışacaktır, ancak netlik için int değişkenlerinizin adını değiştirmelisiniz. Çünkü dolgularınızı DP'de tanımlarsınız ve verilen bu cihaz için piksel cinsinden ne olacağını hesaplarsınız.
Glenn85

Dp'yi piksele dönüştürüyorsunuz. Değişken isimleri kafa karıştırıcı. "paddingPixel" gerçekten dp anlamına gelir
Jiechao Wang

92

Dolguyu kaynak dosyalarında saklarsanız,

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

Sizin için dönüşüm yapar.




9

TypedValueManuel olarak hesaplamaya kıyasla kullanmak , piksele dönüştürmenin daha temiz bir yoludur:

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

Esasen, TypedValue.applyDimensionmevcut cihazın görüntü özelliklerine bağlı olarak istenen dolguyu uygun şekilde piksele dönüştürür.

Daha fazla bilgi için bkz . TypedValue.applyDimension Docs .


1
px ve dp ters çevrilmemeli mi?
chris838

Yaptığım şeyin özünün doğru olduğunu düşünüyorum. Ancak adlandırma kafa karıştırıcı olduğunu düşünüyorum. Daha açık olacak şekilde düzenleyeceğim. Geri dönüşünüz için teşekkür ederiz.
i2097i

7

doldurmayı dinamik olarak ayarlamak için aşağıdaki yöntemi kullanın

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

Misal :

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

3

Dolguyu ayarlamak için aşağıdaki kodu yazın, size yardımcı olabilir.

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

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

ApplyPaddingTextView.setLayoutParams(layoutparams);

Alt görünümün üst düzenine göre LinearLayout.LayoutParamsveya kullanınRelativeLayout.LayoutParams


setPadding () yöntemi LayoutParams tarafından erişilebilir bir yöntem değildir. Hiç olup olmadığından emin değilim.
Sriram

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

4
Sınırlı ve anında yardım sağlayabilecek bu kod snippet'i için teşekkür ederiz. Bir Doğru bir açıklama ölçüde bu soruna iyi bir çözüm olmasının nedeni göstererek uzun vadeli değerini artıracak ve diğer benzer sorularla gelecek okuyucularına daha kullanışlı bir hale getirecektir. Yaptığınız varsayımlar dahil bazı açıklamalar eklemek için lütfen yanıtınızı düzenleyin .
Oğlak

0

Programlı olarak doldururken, pikseli Dp'ye dönüştürerek yoğunlukla ilgili değerlere dönüştürün.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.