Android, Özel görünümün yüksekliğini ve genişliğini programlı olarak ayarla


128

Adlı özel bir görünüm oluşturdum Graphview. İşte GraphView sınıfının yapısı.

public class GraphView extends View {

    public GraphView(Context context, float[] values, String title, String[] horlabels, String[] verlabels, boolean type) {
        super(context);
                ........
   }

   ..................
   .................
}

Görünümü kullanarak bir tablo gösterimine ekledim addview(). İyi çalışıyor. Şimdi için yükseklik ve genişliği ayarlamak istiyorum GraphView. Bu nasıl yapılır?

Yanıtlar:


140

Kolay yol, boyutu programatik olarak şu şekilde ayarlamaktır:

graphView.setLayoutParams(new LayoutParams(width, height));

Görüntünün tam boyutunu biliyorsanız, bu sorun değil. Eğer daha esnek bir yaklaşım isteyen, ancak, geçersiz olabilir onMeasure()alanı ve düzen kısıtlamaları (bağlı olarak daha kesin bir görünümü ölçmek için bir yöntem wrap_content, match_parentya da sabit bir boyutta).

Android dokümanlarına ve SDK dizininizdeki örneğe onMeasure()bakarak nasıl geçersiz kılacağınıza dair bir örnek bulabilirsiniz .LabelView


16
Orada hangi LayoutParams'ı içe aktardığınızı bilmek faydalı olacaktır.
user3690202

1
, Yerleştirildiği LayoutParamsdüzenden olmalıdır graphView. Örneğin, XML düzen dosyası graphViewiçine yerleştirilmişse RelativeLayout, o zaman kullanmalısınıznew RelativeLayout.LayoutParams(width, height)
Vic

208

Yükseklik ve genişliği şu şekilde ayarlayabilirsiniz:

myGraphView.setLayoutParams(new LayoutParams(width, height));

76
Kullandığınız LayoutParam sınıfının doğru üst Layout sınıfından olduğundan emin olmalısınız. Örneğin, GraphView'ınız bir LinearLayout içinde yer alıyorsa, LinearLayout.LayoutParams sınıfını kullanmanız gerekir.
yincrash

41
Bu da işe yarar ve doğru LayoutParams sınıfını kullanmanızı sağlar: yapmanız yeterlidir myGraphView.getLayoutParams().height = 100;.
sulai

21
Bunu yaparsanız this.getLayoutParams().height = 100, onu takip ettiğinizden emin olun this.setLayoutParams(this.getLayoutParams()), aksi takdirde hiçbir şey yapmaz (yararlı).
Achal Dave

4
Bence bu cevabın daha fazla puan alması garip. Daha kolay olsa da daha az modüler; Görünümünüzü farklı bir yerde kullanmak isterseniz, bu genişlik / yükseklik değerlerini oraya da kodlamanız gerekir. Bunu kullanırken dikkatli olun.
gardarh

1
Bunu belirttiğiniz için teşekkürler @ yincrash. Özel görünümümün üst sınıfı (benim durumumda SurfaceView) yerine üst görünüm sınıfını (benim durumumda RelativeLayout) kullanmam garip görünüyor
ericn

75

bir görünümün yüksekliğini ve genişliğini bunun gibi göreli bir düzende ayarlayabilirsiniz

ViewGroup.LayoutParams params = view.getLayoutParams();
params.height = 130;
view.setLayoutParams(params);

2
layoutparam'ı yeniden ayarlamanıza gerek yoktur. Otomatik olarak yansıtılır. Bu, nesne yönelimli yaklaşımın avantajıdır.
Dipendra

8
@Dipendra, ve setLayoutParams()gibi diğer yöntemleri çağırdığı için gereklidirresolveLayoutParams()requestLayout()
William

() olarak onCreate getLayoutParams özel durum veren boş value.So params.height olduğu neden durum
Sibasish

Yüksekliğini ayarlamanız gereken görünüme başvurmalısınız. Aynı görüşü işaret edip etmediğinizi kontrol edin
Rakshi

1
Başlarken layoutParamsbir görünümün başlangıcında bir NPE olacak, bu koşmak size hangi noktada açıklayınız?
John Sardinha

6

Kotlin'de, sanal özelliklerini kullanarak herhangi bir görünümün genişliğini ve yüksekliğini doğrudan ayarlayabilirsiniz:

someView.layoutParams.width = 100
someView.layoutParams.height = 200

4
spin12.setLayoutParams(new LinearLayout.LayoutParams(200, 120));

spin12değer değiştirici ve bir 200 , 120 olduğunu widthve heightşunlara ait spinner.


3

Bu, üst görünümün bir örneği olduğu varsayılarak Kotlin tabanlı bir sürümdür LinearLayout.

someView.layoutParams = LinearLayout.LayoutParams(100, 200)

Bu, genişliği ve yüksekliği ( 100ve 200) tek bir satırda ayarlamaya izin verir .

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.