2012-08-14 16 views
7

Android'in düzenler için yaptığı tüm ölçümlerle gerçekten kafam karıştı. Temel olarak, ortaya konulduktan hemen sonra ortaya konan bir görünümün gerçek hesaplanmış yüksekliğini ve genişliğini elde etmek istiyorum. Hesaplanmış yükseklik ve genişlik elde etmem gerekiyor çünkü Viewpropertyanimator kullanarak açarken hareketlendirmek istediğim gizli bir LinearLayout var. Animasyondan önce hedef genişliğini (hesaplanan genişlik olan) animatöre vermem gerekiyor. Bu düzenin genişliği dinamiktir, çünkü genişlik için android:weight parametresine bağlıdır, bu nedenle statik bir değer veremem. getMeasuredHeight() ve width dönen 0 ölçüden sonra()

package com.example.testproject; 

import android.app.Activity; 
import android.graphics.Color; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Display; 
import android.view.View; 
import android.widget.LinearLayout; 
import android.widget.LinearLayout.LayoutParams; 

public class TestActivity extends Activity 
    { 

    private LinearLayout gmailListContainer, yahooMailListContainer, windowsLiveListContainer; 
    private LinearLayout emailMessageContainer; 

    private Display display; 



    @Override 
    protected void onCreate(Bundle savedInstanceState) 
     { 
     super.onCreate(savedInstanceState); 

     this.setContentView(R.layout.activity_test); 

     gmailListContainer = (LinearLayout) this.findViewById(R.id.email_activity_gmail_layout); 
     yahooMailListContainer = (LinearLayout) this.findViewById(R.id.email_activity_yahoo_mail_layout); 
     windowsLiveListContainer = (LinearLayout) this.findViewById(R.id.email_activity_windows_live_layout); 
     emailMessageContainer = (LinearLayout) this.findViewById(R.id.email_activity_email_content_layout); 

     gmailListContainer.setBackgroundColor(Color.CYAN); 
     yahooMailListContainer.setBackgroundColor(Color.MAGENTA); 
     windowsLiveListContainer.setBackgroundColor(Color.GREEN); 
     emailMessageContainer.setBackgroundColor(Color.RED); 

     display = getWindowManager().getDefaultDisplay(); 

     setMeasuredDimensions(); 
     } 

    private void setMeasuredDimensions() 
     { 
     View v = this.findViewById(R.id.email_activity_layout); 
     v.measure(display.getWidth(), display.getHeight()); 
     Log.v("EmailActivity", v.getMeasuredHeight() + ", " +v.getMeasuredWidth()); 
     } 

    private void setWeight(LinearLayout container, float weight) 
     { 
     LinearLayout.LayoutParams params = (LayoutParams) container.getLayoutParams(); 
     params.weight = weight; 
     container.setLayoutParams(params); 
     container.setVisibility(View.VISIBLE); 
     } 

    } 

İşte alakalı düzen kaynak::

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/email_activity_layout" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="horizontal" 
android:baselineAligned="false"> 

<LinearLayout 
    android:id="@+id/email_activity_gmail_layout" 
    android:layout_width="0dp" 
    android:layout_height="fill_parent" 
    android:layout_weight="1" 
    /> 
<LinearLayout 
    android:id="@+id/email_activity_yahoo_mail_layout" 
    android:layout_width="0dp" 
    android:layout_height="fill_parent" 
    android:layout_weight="1" 
    /> 
<LinearLayout 
    android:id="@+id/email_activity_windows_live_layout" 
    android:layout_width="0dp" 
    android:layout_height="fill_parent" 
    android:layout_weight="1" 
    /> 
<LinearLayout 
    android:id="@+id/email_activity_email_content_layout" 
    android:layout_width="0dp" 
    android:layout_height="fill_parent" 
    android:layout_weight="0" 
    /> 

cevap

6

sizin Faaliyet için aşağıdaki yöntemi ekleyin ve ondan senin yöntemini çağırın

İşte benim etkinlik sınıfı.

onCreate yılında
@Override 
public void onWindowFocusChanged(boolean hasFocus) { 
     setMeasuredDimensions(); 
    super.onWindowFocusChanged(hasFocus); 
} 

() Eğer görüntü elde edilmiştir garanti edemez. Biraz zaman alabilir. Ancak yukarıdaki yöntem, yalnızca görünüm tamamen çizildiğinde çağrılır. Bu nedenle, genişlik ve yüksekliği tam olarak burada alabilmelisiniz.

+0

Önceki yorumumu kazıyın. İşte düzenlenmiş bir tane: Hey orda! Ben senin çözümünü denedim, ve çalışır, ancak ben v.measure (display.getWidth(), display.getHeight()) 'i çağırdığımda, tekrar değerler 0'a dönüyor. önce yükseklik ve genişlik, ekranın yüksekliğini ve genişliğini ve günlüğe kaydedilen yüksekliği ve genişliği yeniden görüntülemede yine bir ölçü komutunu ateşleyin. İlk kayıtta, doğru değerler döndürülür. İkinci kayıtta, değerler 0'a sıfırlandı. Neden bu? – Neilers

+0

Ekranınızın genişliğinin ve yüksekliğinin ne olduğunu kontrol ettiniz mi? Belki 0 kendisi –

+0

Ne yazık ki, 0 değildi. Ayrıca, yanılıyorsam beni düzeltin, ancak bu yaklaşım görüşlerin zaten çizildiğini düşünür. Bulmaya çalıştığım şey, ** 1 için bir yoldur. ** İç doğrusal düzenleri, ilk 3'ün ağırlık = 1 ve 4'ün ağırlık = 0 ** 2 olmasını sağlayacak şekilde ayarlayın. ** Kuvvet düzeni, ölçü veya Bu modda her biri için hesaplanan yükseklik ve ağırlık alabilmem için bir şey ** 3. ** İlk 3 düzenden 2'sinin ağırlık = 1 ve 1 ile ağırlık = 1 olacak şekilde düzenleri ayarlayın ve 4'ün ağırlığı = 2 ** 4. ** bu 2. modda her biri için genişlik ve yükseklik elde edin ** 5. ** Ağırlıkları geri alın ve sadece o zaman görüşlerini çizeceğim – Neilers

İlgili konular