2012-08-22 17 views
15

Hem yükseklik hem de genişlik olarak xml olarak fill_parent olarak tanımlanan doğrusal düzenin genişliğini ve yüksekliğini nasıl alabilirim? Güvence yöntemini denedim ama neden tam değer vermediğini bilmiyorum. Onarma yöntemi bitirmeden önce bu değerlere bir Etkinlikte ihtiyacım var.Çalışma zamanında düzen yüksekliğini ve genişliğini alın android

+0

IIRC, ölçülmeden önce herhangi bir şeyin yüksekliğini/genişliğini alamazsınız. OnSizeChanged çağrıldığında atandı, eğer onLayout'u geçersiz kılarsanız tüm görünümler bir yükseklik ve genişliğe sahip olmalıdır – tom502

+0

@ tom502 bana bir link veya kod parçası verebilir misiniz? Çok yardımcı olacak. – MGDroid

cevap

31

varsayalım ben XML tanımlanan bir LinearLayout genişliğini almak zorunda. XML ile başvurmak zorundayım. Örneğin, LinearLayoutl tanımlayın.

l = (LinearLayout)findviewbyid(R.id.l1); 
ViewTreeObserver observer = l.getViewTreeObserver(); 
     observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 

      @Override 
      public void onGlobalLayout() { 
       // TODO Auto-generated method stub 
       init(); 
      l.getViewTreeObserver().removeGlobalOnLayoutListener(
        this); 
     } 
    }); 

protected void init() { 
     int a= l.getHeight(); 
      int b = l.getWidth(); 
Toast.makeText(getActivity,""+a+" "+b,3000).show(); 
    } 
    callfragment(); 
} 
+1

Farkında Olun! OnCreate bitirmeden önce size değer vermez. OnCreate metodu içinde çağırmış olsaydım, geçersiz kılma yöntemi geç çağrılacak. Bu yüzden uygulamanızın yavaş gitmesi gibi görünebilir, ancak amacım çözülür. – MGDroid

5

Dizilim oluşturulduktan sonra, genişlik ve yükseklik değerleri ayarlanır, ardından öğeler ölçülür. OnSizeChanged için yapılan ilk çağrıda, bu denetimi kullandığınız takdirde, 0 olacaktır.

burada Biraz daha detay https://groups.google.com/forum/?fromgroups=#!topic/android-developers/nNEp6xBnPiw

ve burada İşte http://developer.android.com/reference/android/view/View.html#Layout

onLayout nasıl kullanılacağını geçerli:

@Override 
protected void onLayout(boolean changed, int l, int t, int r, int b) { 
    int width = someView.getWidth(); 
    int height = someView.getHeight(); 
} 
2

Sen düzeni düzen değişikliği dinleyici eklemek ve en yeni yükseklik ve genişlik veya son değişiklikten önce bir tane bile olabilir. 11

zaman görünümü değişikliğinin sınırları nedeniyle düzeni işleme çağrılacak bir dinleyici ekleyin Eklendi API düzeyinde

. Daha sonra ilk onGlobalLayout dinleyici kaldırmak ve yüksekliği ile istediğini yapmak -

LinearLayout myLinearLayout = (LinearLayout) findViewById(R.id.my_linear_layout); 
myLinearLayout.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { 
     @Override 
     public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { 
      // Preventing extra work because method will be called many times. 
      if(height == (bottom - top)) 
       return; 

      height = (bottom - top); 
      // do something here... 
      } 
    }); 
3

o iş elde etmek için, istenilen yükseklik değeri 0'dan büyük olup olmadığını kontrol etmek gerekir. Dinleyici, yöntemini sürekli olarak çağırır ve ilk çağrı ile görüntünün düzgün bir şekilde ölçülmesinin garanti edilmez.

final LinearLayout parent = (LinearLayout) findViewById(R.id.parentView); 
    parent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      int availableHeight = parent.getMeasuredHeight(); 
      if(availableHeight>0) { 
       parent.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
       //save height here and do whatever you want with it 
      } 
     } 
    }); 
+0

Bu hile yaptı - teşekkürler. Kaldırılacak dinleyici çağrısı, API 16 seviyesinden kaldırılmıştır. Bu yayın, daha önceki ve sonraki API'lar için aramayı nasıl destekleyeceğini açıklar http://stackoverflow.com/a/23741481/2162226 – gnB

İlgili konular