Özel bir görünümü programlı olarak nasıl yeniden boyutlandırabilirim?


164

RelativeLayout'tan genişletilmiş özel bir görünüm kodluyorum ve programlı olarak yeniden boyutlandırmak istiyorum, Nasıl yapabilirim?

özel görünüm Sınıfı şuna benzer:

public ActiveSlideView(Context context, AttributeSet attr){
        super(context, attr);
        LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if(inflater != null){       
            inflater.inflate(R.layout.active_slide, this);
        }

Yanıtlar:


253

Bir görünümün yüksekliğini veya genişliğini geçemezseniz Android bir istisna atar. Yeni bir LayoutParams nesnesi oluşturmak yerine, orijinali kullanın, böylece diğer tüm ayar parametreleri korunur. GetLayoutParams tarafından döndürülen LayoutParams türünün, yeniden boyutlandırdığınız görünümün değil, üst mizanpajın türü olduğunu unutmayın .

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) someLayout.getLayoutParams();
params.height = 130;
someLayout.setLayoutParams(params);

2
@HerbertD'den de bahsettiğim gibi LinearLayout.LayoutParams kullanmadıkça bunu yaparken de bir hata alıyorum, hatta üzerinden yeniden boyutlandırdığım bir RelativeLayout.
Martin Belcher - AtWrk

6
@Eigo Android belgelerine göre, LayoutParams üst Görünüm'e aktarılır, çünkü bu düzenden sorumlu görünümdür.
sstn

1
İn değerinin dp değerine dönüştürülmesi gerekip gerekmediği veya işe yarayacağı.
Dory

Gereksiz yere yeni bir LayoutParams nesnesi oluşturmayı önlediğinden bu da tercih edilir
Stephen Kidson

129
this.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, theSizeIWant));

Sorun çözüldü!

NOT: Üst Mizanpajları kullandığınızdan emin olun LayoutParams. Benimki LinearLayout.LayoutParams!


3
Wut. Neden kullanmıyorsunuzRelativeLayout.LayoutParams?
nmr

1
Bu benim için işe yaramadı, bunun için bir sınıf döküm istisnası var.
Tapan Thaker

4
@Tapan Thanker Üst düzenin LayoutParams öğesini kullanın. Üst öğe tasarımım LinearLayout.
herbertD

10
Bunun daha genel bir sürümünü yazdım: private void resizeView(View view, int newWidth, int newHeight) { try { Constructor<? extends LayoutParams> ctor = view.getLayoutParams().getClass().getDeclaredConstructor(int.class, int.class); view.setLayoutParams(ctor.newInstance(newWidth, newHeight)); } catch (Exception e) { e.printStackTrace(); } }
atroutt

2
Bu, diğer tüm parametreleri varsayılan değerlere sıfırlayacaktır. @smisiewicz cevabı daha iyi.
Fran Marzoa

66

Bu benim için çalışıyor:

ViewGroup.LayoutParams params = layout.getLayoutParams();
params.height = customHeight;
layout.requestLayout();

7
Bu, diğer yanıtlardan çok daha iyidir çünkü bu kod üst ViewGroup'un tam türünü bilmek gerektirmez.
Bart Burg

1
CallLayoutParams (params) çağrısı ile requestLayout () çağrısı arasındaki farkın ne olduğunu biliyor musunuz?
voghDev

2
setLayoutParams (params) requestLayout () öğesini içerir.
illusionJJ

44

Değeri ne olursa olsun, görünümü cihazdan bağımsız piksellerde yeniden boyutlandırmak istediğinizi varsayalım ( dp ) : -

Piksellerden dps'ye dönüştürmek applyDimensioniçin sınıfın bir üyesi olarak adlandırılan bir yöntem kullanmanız gerekir TypedValue. Yüksekliği 150dp'ye (demek ki) ayarlamak istersem - o zaman bunu yapabilirim:

float pixels = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 150, getResources().getDisplayMetrics());
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) someLayout.getLayoutParams();
params.height = (int) pixels;
someLayout.setLayoutParams(params);

burada ifade: getResources().getDisplayMetrics()ekran yoğunluğunu / çözünürlüğünü alır


6
float pixels = context.getResources().getDimensionPixelSize(R.dimen.card_height);
Boyutunuzu

bu cevap doğru cevap olarak daha uygundur !. Teşekkürler
Yunus Kulyyev


6

bunu deneyin:

...
View view = inflater.inflate(R.layout.active_slide, this);
view.setMinimumWidth(200);

Üzgünüm, cevapladığından beri tüm soruları göndermedim. Şimdi tüm soru bu. Teşekkürler!
herbertD

6

İşte @herbertD'den yukarıdaki çözümün daha genel bir sürümü:

private void resizeView(View view, int newWidth, int newHeight) { 
    try { 
        Constructor<? extends LayoutParams> ctor = view.getLayoutParams().getClass().getDeclaredConstructor(int.class, int.class); 
        view.setLayoutParams(ctor.newInstance(newWidth, newHeight));   
    } catch (Exception e) { 
        e.printStackTrace(); 
    }
}

@atroutt, tam anlamıyla günümü kurtardın :)
Qasim

5

Bu şekilde, özel görünümün genişliğini artırmak için kullandım

customDrawingView.post(new Runnable() {
                            @Override
                            public void run() {
                                View view_instance = customDrawingView;
                                android.view.ViewGroup.LayoutParams params = view_instance
                                        .getLayoutParams();
                                int newLayoutWidth = customDrawingView
                                        .getWidth()
                                        + customDrawingView.getWidth();
                                params.width = newLayoutWidth;
                                view_instance.setLayoutParams(params);
                                screenWidthBackup = params.width;
                            }
                        });

4

Ben bu şekilde çözdü .. Temelde xml dosyası içinde basit bir görünüm var.

 View viewname = findViewById(R.id.prod_extra);
             prodExtra.getLayoutParams().height=64;

2
haha, çok naif ama iyi çalışan bir yol, ancak olası yuvalanmış çocuklara değişikliği düzgün bir şekilde yaymak için setLayoutParams () 'yi çağırmanızı öneririm, bu yüzden .width ve .height güncellendikten sonra view.setLayoutParams (view.getLayoutParams ()) her zaman yazın kanıtı
comeGetSome

@Bhargav Rao bu konuda bana yardımcı olabilir misiniz: https://stackoverflow.com/q/44259342/6596724
tux-world

2

Sadece varsa two or three condition(sizes)o zaman @Overide onMeasure gibi kullanabilirsiniz

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
{
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

CustomView sınıfındaki bu koşullar için bedeninizi kolayca değiştirin.


1

geçersiz kılıyorsanız onMeasure, yeni boyutları güncellemeyi unutmayın

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    setMeasuredDimension(newWidth, newHeight);
}

1

Bunu böyle başardım. In Sileria cevap o / o aşağıdaki yaptı:

ViewGroup.LayoutParams params = layout.getLayoutParams();
params.height = customHeight;
layout.requestLayout();

Bu doğrudur, ancak yüksekliği girmemizi bekler pixels, ancak dpyüksekliğin olmasını istiyorum, bu yüzden ekledim:

public int convertDpToPixelInt(float dp, Context context) {
    return (int) (dp * (((float) context.getResources().getDisplayMetrics().densityDpi) / 160.0f));
}

Yani şöyle görünecek:

ViewGroup.LayoutParams params = layout.getLayoutParams();
params.height = convertDpToPixelInt(50, getContext());
layout.requestLayout();

0

Ben de öyle yaptım:

View myView;  
myView.getLayoutParams().height = 32;  
myView.getLayoutParams().width = 32;

Bu görünümün ait olduğu bir görünüm grubu varsa, etkili olması için ViewGroup.requestLayout () yöntemini de çağırmanız gerekebilir.

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.