2012-08-14 7 views
7

私は、アンドロイドがレイアウトのために行うこの測定全体と本当に混同しています。基本的には、ビューの実際の計算された高さと幅をレイアウトする前にレイアウトしておきたいのです。 viewpropertyanimatorを使用して開いたときにアニメーション化したい隠されたLinearLayoutがあるので、計算された高さと幅を取得する必要があります。私はアニメーション化する前にアニメーターに目標幅(計算された幅)を供給する必要があります。このレイアウトの幅は、その幅のandroid:weightパラメータに依存しているため動的です。したがって、静的な値を与えることはできません。ここでgetMeasuredHeight()とmeasure()の後に返される幅

が私の活動のクラスがあります:

<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

あなたの活動に以下のメソッドを追加し、それから、あなたのメソッドを呼び出します。

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

    } 

ここでは、関連するレイアウトリソースです。

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

onCreate()では、ビューが描画されることは保証できません。時間がかかることがあります。しかし、この上のメソッドは、ビューが完全に描画されたときにのみ呼び出されます。だからあなたはここで正確に幅と高さを得ることができるはずです。

+0

私の前のコメントをスクラッチ。ここには編集済みのものがあります: ねえ!私はあなたのソリューションを試してみましたが、 'v.measure(display.getWidth()、display.getHeight());'を呼び出すと再び値は0に戻ります。高さと幅を最初に設定すると、ディスプレイ上の高さと幅、および記録された高さと幅を再び指定して、ビュー上にメジャーコマンドを再起動します。最初のログでは、正しい値が返されます。 2番目のログでは、値は0にリセットされています。なぜですか? – Neilers

+0

ディスプレイの幅と高さは何ですか?おそらくそれは0です –

+0

残念なことに、それは0ではありませんでした。また、私が間違っている場合は私を修正しますが、このアプローチは、ビューが既に描画されているasumes。私が見つけようとしているのは、** 1です**最初の3つのウェイトが1、4番目のウェイトが0 ** ** 2となるように内側の線形レイアウトを設定します。**レイアウト、このモードで計算された身長と体重を得ることができるように** ** 3。**最初の3つのレイアウトのうちの2つが重み= 1、重み= 1の4つの重みを持つようにレイアウトを設定します。 2 ** 4。**この2番目のモードでは、それぞれの幅と高さを取得します** 5。**重さを元に戻してから、ビューを描画します – Neilers

関連する問題