TextView Kenar Boşluğu Nasıl Değiştirilir


82

TextView'i Programlı olarak LinearLayout'a ekledim ve bazı harici olaylarda bu TextView'in alt kenar boşluğunu -10'a düşürmek istiyorum, bunun için bunu denedim.

LinearLayout.LayoutParams lastTxtParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
lastTxtParams.setMargins(0, 0, 0, -10);
mOldTextView.setLayoutParams(lastTxtParams);
mOldTextView.invalidate();

Görünüm'e eklenen widget'ın Kenar Boşluğunu değiştirmenin doğru yolu mu?
Bazıları nasıl çalışmıyor.

Yanıtlar:


187
TextView forgot_pswrd = (TextView) findViewById(R.id.ForgotPasswordText);
forgot_pswrd.setOnTouchListener(this);     
LinearLayout.LayoutParams llp = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
llp.setMargins(50, 0, 0, 0); // llp.setMargins(left, top, right, bottom);
forgot_pswrd.setLayoutParams(llp);

Bunu yaptım ve mükemmel çalıştı. Belki de -ve değerini verirken kodunuz bu yüzden çalışmıyor. Bu kodu, görünümün referansını oluşturduğunuz yere koyarsınız.


Bu çağrı API seviyesi 19 gerektirir.
Sanjay Kumar

4
@SanjayKumar - Hayır, API seviyesi 19 gerektirdiğine dair herhangi bir kısıtlama yok
Debarati

1
Bu, OP'nin sorusuna nasıl cevap verir? Görünüşe göre kod, fazladan ekstra satır ayarı dokunma dinleyicisi haricinde aynı gibi görünüyor, geçersizate () çağırmıyor ve yapıcıda LinearLayout.LayoutParams [LayoutParams.WRAP_CONTENT vs LinearLayout.LayoutParams.WRAP_CONTENT]? Buna ek olarak (önemli değil), OP programla oluşturulan TextView üzerinde kenar boşluklarının ayarlanmasını istiyor, ancak cevap TextView'i findViewById () aracılığıyla mizanpaj xml'den alıyor. Burada neyi kaçırdığımı merak ediyorum ...
Melquiades

@Melquiades sizinle aynı fikirdedir, soruya cevap vermediği için seçilen cevaptan çıkarılır, ayrıca cevap Maybe as you are giving the value in -vemarjlarında belirtildiği gibi bir -ve değer olabilir.
Kullanıcı7723337

61

Xml'deki mizanpajınız muhtemelen içinde bir layout_margin (Sol | Sağ | vb.) Özniteliğine sahiptir, bu da xml tarafından oluşturulan nesneye erişmeniz ve onu değiştirmeniz gerektiği anlamına gelir.

Bu çözümü çok basit buldum:

ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams) mTextView
        .getLayoutParams();

mlp.setMargins(adjustmentPxs, 0, 0, 0);

break;

Metin görünümünüzün LayoutParams örneğini alın, bunu MarginLayoutParams'a indirin ve kenar boşluklarını ayarlamak için setMargins yöntemini kullanın.


Bu bana ClassCastException veriyor: -> ViewGroup.LayoutParams ViewGroup.MarginLayoutParams
Harshil Pansare

10

Bu zor bir sorundur, bir tablo düzeninin bir satırındaki metin görünümüne kenar boşluğu ayarladım. aşağıya bakın:

TableLayout tl = new TableLayout(this);
tl.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

TableRow tr = new TableRow(this);        
tr.setBackgroundResource(R.color.rowColor);

LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
params.setMargins(4, 4, 4, 4);

TextView tv = new TextView(this);
tv.setBackgroundResource(R.color.textviewColor);
tv.setText("hello");
tr.addView(tv, params);

TextView tv2 = new TextView(this);
tv2.setBackgroundResource(R.color.textviewColor);
tv2.setText("hi");
tr.addView(tv2, params);

tl.addView(tr);
setContentView(tl);

Tablo satırında kullanılmak üzere LayoutParams için içe aktarmak için gereken sınıf şudur:

import android.widget.**TableRow**.LayoutParams;

Tablo satırı için sınıf eklediğimi not etmek önemlidir. benzer şekilde LayoutParams'ı kullanmak için birçok başka sınıf mevcuttur:

import android.widget.**RelativeLayout**.LayoutParams;

android.widget'i içe aktarın. LinearLayout .LayoutParams;

bu yüzden buna göre kullanın.


5

setMargins (), düzen kenar boşluklarını değil, TextView’un INNER kenar boşluklarını ayarlar. Yapmak istediğin bu mu? Bu iki farklı kenar boşluğu oldukça karmaşık olabilir.

Düzen kenar boşluklarını ayarlamak istiyorsanız, TextView öğesinin LayoutParams öğesini değiştirin (textview.getLayoutParams (), ardından döndürülen LayoutParams nesnesindeki parametreleri değiştirin).

LinearLayout'unuzda hiçbir şeyi değiştirmenize gerek yoktur.

Saygılarımızla, Oliver


3

TextView, setMargins'i desteklemez. Android dokümanları şunu söylüyor:

Bir görünüm bir dolguyu tanımlayabilse de, kenar boşlukları için herhangi bir destek sağlamaz. Ancak görüş grupları böyle bir destek sağlar. Daha fazla bilgi için ViewGroup ve ViewGroup.MarginLayoutParams'a bakın.


1

İşte başka bir yaklaşım ...

Aynı soruna geldiğimde, burada önerilen çözümleri beğenmedim. Bu yüzden başka bir yol buldum: XML dosyasına iki önemli alanla ayırmak istediğim iki alan arasına bir TextView ekledim:

  1. görünürlük "GİTTİ" olarak ayarlandı (yer kaplamıyor ..)
  2. yükseklik, ayrılığa ihtiyacım olan şey olarak ayarlandı.

    XML:
    ...//some view up here
    <TextView
        android:id="@+id/dialogSeparator"
        android:layout_width="match_parent"
        android:layout_height="30dp"
        android:visibility="gone"/>
    ...//some view down here
    

Şimdi, ben kod, tek yapmam gereken basitçe görünürlüğü görünmez olarak değiştirmek (yani orada ve gerekli alanı alıyor, ama görünmüyor)

    JAVA:

    TextView tvSeparator = (TextView)activity.findViewById(R.id.dialogSeparator);
    tvSeparator.setVisibility(View.INVISIBLE);
    //Inside an activity extended class I can use 'this' instead of 'activity'.

Viola ... Gerekli marjı aldım. BTW, Bu çözüm dikey yönlendirmeye sahip LinearLayout içindir, ancak bunu farklı düzenlerle yapabilirsiniz.

Bu yardımcı olur umarım.


0

Muhtemelen çizildikten sonra pafta marjını değiştiriyorsunuzdur. mOldTextView.invalidate () işe yaramaz. yeni yapılandırmayı aktarmak için ana cihazda requestLayout () öğesini çağırmanız gerekiyordu. Düzen değiştirme kodunu çizim gerçekleşmeden önce taşıdığınızda, her şey yolunda gitti.


0
        TextView tv = (TextView)findViewById(R.id.item_title));
        RelativeLayout.LayoutParams mRelativelp = (RelativeLayout.LayoutParams) tv
                    .getLayoutParams();
        mRelativelp.setMargins(DptoPxConvertion(15), 0, DptoPxConvertion (15), 0);
        tv.setLayoutParams(mRelativelp);

    private int DptoPxConvertion(int dpValue)
    {
       return (int)((dpValue * mContext.getResources().getDisplayMetrics().density) + 0.5);
    }

() textview ait getLayoutParams dayalı olarak ilgili Parametreler için döküm gereken XML textview arasında Ana .

<RelativeLayout>
   <TextView
    android:id="@+id/item_title">
</RelativeLayout>

Farklı cihazlarda aynı gerçek boyutu oluşturmak için yukarıda kullandığım DptoPxConvertion () yöntemini kullanın. setMargin (sol, üst, sağ, alt) parametreleri dp değil piksel cinsinden değerleri alır . Daha fazla referans için bu Bağlantıya bakınız Cevap

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.