2010-06-17 16 views
24

Etkinliğimin görünür boyutunu nasıl bilebilirim? Bir Aktivitede görünen boyut nasıl elde edilir?

Ben Aktivite gerçek boyutunu almaya çalışıyorum,
değil getHeight() ve getWidth() yükseklik ve genişlik, bana tam ekran boyutuna verir
.

+1

Bunu neden istiyorsun? Çoğu durumda bu gerekli değildir ve ihtiyacınız olabilecek en çok şey, farklı ekran boyutlarını işlemek için android ile gelen daha iyi teknikler ile yapılabilir. – Janusz

+3

Etkinliğin genişliği ve yüksekliğinde kaç piksel olduğunu bilmem gerekiyor. Kartografik hassasiyetle ilgisi var. – Tsimmi

+0

Haritayı görüntülemek için bir harita görünümü veya özel bir görünüm kullanıyor musunuz? – Janusz

cevap

11

Etkinliğimin tam yüksekliğini bilmenin bir yolunu buldum: Başlık çubuğunun ve görev çubuğunun arkasındaki tüm kullanılabilir ekranı dolduran bir görünümünüz varsa, bu etkinliğin gerçek yüksekliğini elde etmek için yalnızca getBottom() kullanın.

+0

getBottom() nedir? Bu yöntemin hangi sınıfı var? –

+0

10 Herhangi bir görünüm: http://developer.android.com/reference/android/view/View.html#getBottom() ebeveyne göreli olup, bu nedenle tüm kullanılabilir ekranı dolduran bir görünüm olması için ihtiyacınız olan şeydir. bu durumda. – Mike

+0

int height = this.getWindow(). GetDecorView(). GetBottom(); – kurt

31

Ben 'u düşünün Activity.getWindow() ve Window.getDecorView()'a bakmak isteyeceksiniz ve bunun genişliğini/yüksekliğini elde edersiniz.

+9

int height = this.getWindow(). GetDecorView(). GetHeight(); – fireydude

+1

Hala 0, tuhafım. – nomnom

+4

Çok erken diyorsunuz, onCreate() sırasında bir yüksekliği yok. – Tatarize

6

Kök düzenimi kullanarak bunu yaptım, sorun, ilk kez çalıştırıldığında onCreate/onStart/onResume yöntemlerinde bu bilgiyi (genişlik ve yükseklik) alamıyor olmanızdır.

bundan sonra herhangi bir anda, boyut (LinearLayout/FrameLayout/TableLayout/vs), benim durumumda ben kullanıyordum kök düzeni alınabilir FrameLayout:

FrameLayout f = (FrameLayout) findViewById(R.id.layout_root); 
Log.d(TAG, "width " + f.getMeasuredWidth()); 
Log.d(TAG, "height " + f.getMeasuredHeight()); 

ya:

FrameLayout f = (FrameLayout) findViewById(R.id.layout_root); 
Log.d(TAG, "width " + f.getRight()); 
Log.d(TAG, "height " + f.getBottom()); 

Buradan düzenlenir --------------------------------------------- -----------

Bu bilgiyi onCreted yönteminde almanın bir yolunu buldum, ancak yalnızca bir etkinliğiniz varsa . Benim durumumda ikinci aktiviteyi çağıran ana aktivitem var.

Ikinci_aktivite çağırmadan önce ana_aktiflik durumunda, yeni bir Itent tarafından, ikinci_aktivite için ek bilgi ekleyebilirim.

int width = getIntent().getExtras().getInt("width"); 
int height = getIntent().getExtras().getInt("height"); 
2

basit yok: bunu yaparken ikinci aktivitenin onCreate yöntemine üzerinde bu bilgileri alabilirsiniz ikinci aktivitesi üzerine Bundan sonra

Intent i = new Intent(this, SecondActivity.class); 
i.putExtra("width", f.getMeasuredWidth()); 
i.putExtra("height", f.getMeasuredHeight()); 
startActivity(i); 

: Burada ilk aktivitesi üzerine ihtiyaç koddur Doğru yol alma getDefaultSize işlevini kullanarak boyut görüntüle.Görünüm tüm aktivitesi üzerine yayılmış durumda, sen aktivite istemci bölge boyutlarını almak için önümüzdeki yaklaşımı kullanabilirsiniz:

public void onMeasure(int widthMeasureSpec, int heightMeasureSpec){ 
    int viewWidth = getDefaultSize(getWidth(), widthMeasureSpec); 
    int viewHeight = getDefaultSize(getHeight(), heightMeasureSpec); 
    ... 
} 

görünümü Tüm aktivitesi üzerine uzanan yapmak için:

MyView testView = new MyView(this); 
LinearLayout testViewGroup = new LinearLayout(this); 
testView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, 
              LayoutParams.FILL_PARENT); 
testViewGroup.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, 
               LayoutParams.FILL_PARENT); 
testViewGroup.addView(testView); 
setContentView(testViewGroup); 
1

yüksekliğini alın etkinlik:

public static int getActivityHeight(Activity activity) 
{ 
    return activity.findViewById(android.R.id.content).getHeight(); 
} 

alın Eğer DataBinding kullanıyorsanız binding olduğu faaliyetin genişliği

public static int getActivityWidth(Activity activity) 
{ 
    return activity.findViewById(android.R.id.content).getWidth(); 
} 
2

(sen olmalıdır), sen binding.getRoot().getHeight() çağırabilir ViewDataBindingDataBindingUtil.setContentView() veya diğer tür DataBindingUtil yöntemi ile yarattı. Eğer OnGlobalLayoutListener kaldırmak zorunda yoksa bu mizanpajınızda her zaman Bir değişiklik koşacağım

binding.getRoot().getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
     binding.getRoot().getViewTreeObserver().removeOnGlobalLayoutListener(this); 

     int height = binding.getRoot().getHeight(); 
    } 
}); 

Not: Eğer düzen böyle yapabilirsiniz boyutuna sahiptir kadar beklemek gerekir.

0

Ben daha fazla zaman tasarrufu cevapları gibi:

myActivity.getWindow().getDecorView().getHeight(); 
myActivity.getWindow().getDecorView().getWidth();