2012-08-14 55 views
7

我真的很困惑這整個測量東西,android的佈局。基本上,我想在佈局之前得到實際計算出的視圖的高度和寬度。我需要計算高度和寬度,因爲我有一個隱藏的LinearLayout,我想在使用viewpropertyanimator打開時設置動畫。我需要在動畫設置動畫之前提供目標寬度(這是計算的寬度)。這個佈局的寬度是動態的,因爲它依賴於其寬度的android:weight參數,所以我不能給出一個靜態值。getMeasuredHeight()和寬度返回0後measure()

這裏是我的活動類:

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); 
     } 

    } 

下面是相關的佈局資源:

<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" 
    /> 

回答

6

添加下面的方法到你的活動,並從中調用你的方法。

@Override 
public void onWindowFocusChanged(boolean hasFocus) { 
     setMeasuredDimensions(); 
    super.onWindowFocusChanged(hasFocus); 
} 

在onCreate()中,你不能保證你的視圖被繪製。這可能需要一些時間。但是,只有當視圖完全繪製時纔會調用上述方法。所以YOu應該能夠在這裏準確地獲得寬度和高度。

+0

劃傷我以前的評論。這是一個編輯的: 嘿!我試過你的解決方案,但它的工作原理,但是當我再次調用'v.measure(display.getWidth(),display.getHeight());'時,這些值返回爲0.我修改了我的代碼來記錄高度和寬度,再次在視圖上觸發一個度量命令,再次提供顯示的高度和寬度,並記錄高度和寬度。在第一個日誌中,返回正確的值。在第二個日誌中,值已重置爲0.爲什麼? – Neilers 2012-08-14 08:08:29

+0

你檢查了你的顯示器的寬度和高度嗎?也許它本身就是0 – 2012-08-14 08:39:47

+0

不幸的是,它不是0.另外,糾正我,如果我錯了,但這種方法假設,已經繪製的意見。我試圖找到的是一種** 1的方法**設置內部線性佈局,使得前3個的weight = 1,第4個的weight = 0 ** 2。**強制佈局,測量或這樣我就可以在這種模式下得到每個人的計算身高和體重** 3。**設置佈局,使前3個佈局中的2個體重= 0,1體重= 1,第4個體重= 2 ** 4 **在第二種模式下獲得每個人的寬度和高度** 5 ** **恢復重量,然後我才能繪製視圖 – Neilers 2012-08-14 09:18:45