SORU
14 EYLÜL 2011, ÇARŞAMBA


OnMeasure geçersiz kılmak için bir yol Authorative()?

Geçersiz kılma onMeasure doğru yolu nedir? Çeşitli yaklaşımlar gördüm. Örneğin,Profesyonel Android GeliştirmeMeasureSpec boyutlarını hesaplamak için kullanır, sonra setMeasuredDimension bir çağrı ile sona erer(). Örneğin:

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
this.setMeasuredDimension(parentWidth/2, parentHeight);
}

this post başı olarak, diğer taraftan, "" yol MeasureSpec, çağrı setMeasuredDimensions kullanmaktır(), . doğru ^strong>izledisetLayoutParams için bir çağrı(), ve süper bir çağrı ile biten.() onMeasure. Örneğin:

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
this.setMeasuredDimension(parentWidth/2, parentHeight);
this.setLayoutParams(new *ParentLayoutType*.LayoutParams(parentWidth/2,parentHeight));
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

Hangi doğru yol mu? Her iki yaklaşım da benim için 0 çalıştı.

Gerçekten herkes onMeasure açıklayan bir öğretici biliyor mu. benim sorduğum sanırım(), düzen, çocuğun boyutları vb manzarası.?

CEVAP
26 NİSAN 2012, PERŞEMBE


Diğer çözümler kapsamlı değildir. Bazı durumlarda çalışırlar, ve başlamak için iyi bir yerdir, ama onlar çalışmak için garanti edilmez.

OnMeasure çağrılan olabilir veya boyutunu değiştirmek için yetkiniz olmayabilir. Senin onMeasure (, ** 5 ** 6) geçirilen değerleri alt görünüm yapmak için izin ne hakkında bilgi içerir. Şu anda üç değer vardır:

  1. MeasureSpec.UNSPECIFIED - İstediğiniz kadar büyük olabilir
  2. MeasureSpec.AT_MOST - istediğiniz kadar büyük (özel boy), Bu örnekte parentWidth.
  3. MeasureSpec.EXACTLY - başka çaremiz Yok. Üst seçti.

Bu Android birden fazla geçiş her madde için doğru boyutu, here bakın bulmak için daha fazla bilgi için yapabilirsiniz.

Eğer bu kuralları takip ederseniz, sizin yaklaşım çalışması garanti edilmez.

Eğer boyutunu değiştirmek için izin olup olmadığını kontrol etmek isterseniz, örneğin aşağıdakileri yapabilirsiniz:

final int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);
final int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);
boolean resizeWidth = widthSpecMode != MeasureSpec.EXACTLY;
boolean resizeHeight = heightSpecMode != MeasureSpec.EXACTLY;

Bu bilgileri kullanarak kendi kodu gibi değerleri değiştirebilirsiniz olup olmadığını bilir. Ya eğer farklı bir şey yapmak gerekir. Hızlı ve kolay bir şekilde istediğiniz bedene çözmek için bir yol aşağıdaki yöntemlerden birini kullanın:

int resolveSizeAndState (int size, int measureSpec, int childMeasuredState)

int resolveSize (int size, int measureSpec)

İlk Petek üzerinde kullanılabilir olsa da, ikinci tüm sürümleri mevcuttur.

Not: resizeWidth resizeHeight her zaman yanlış olduğunu fark edebilirsiniz. Bu ise MATCH_PARENT talep olsam böyle buldum. Benim ana düzeni WRAP_CONTENT talep ve BELİRTİLMEMİŞ aşamasında Integer.MAX_VALUE boyutu isteyerek bunu düzeltmek için başardı. Böylece max boyutu verir senin üst onMeasure sonraki geçişte izin verir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Edge-CGI 3D Tutorials and more!

    Edge-CGI 3D

    11 HAZİRAN 2013
  • LardTardProductions's channel

    LardTardProd

    10 NİSAN 2009
  • Muse

    Muse

    28 EYLÜL 2006