2012-09-14 58 views
2

我有一個ListFragment,它在onActivityCreated()方法中添加了2個視圖 - 一個MapView通用視圖(持久標頭)。我希望ListView以縱向模式顯示在地圖視圖和標題下方,並且在地圖視圖的右側以及橫向模式下的標題下方顯示。我還喜歡MapView的高度(縱向)和寬度(橫向)爲可用窗口大小的百分比(減去操作欄,狀態欄和導航欄 - 如果設備上存在)。爲了實現這一點,我相信我需要獲得窗口大小併爲所有3個視圖計算適當的高度,寬度和佈局邊距。我已經嘗試了類似問題中推薦的幾件事,但解決方案總是返回設備的高度/寬度,而不是活動的窗口大小。如何獲取活動的窗口寬度和高度?

任何想法。提前致謝。

+0

首先感謝大家的答覆。我故意沒有去使用不同的佈局與允許重量屬性ViewGroups的路線。我動態添加視圖的原因是,ListActivity管理我的空和「加載」狀態。用我目前的方法,我所要做的就是告訴ListActivity我的空視圖是什麼,並在有數據時設置列表適配器。這樣,用戶將在列表爲空時看到我的空視圖,並在加載時看到ProgressBar。我的主要問題是如何以編程方式獲取寬度/高度。 – oracleicom

+0

我最終爲視圖添加了一個GlobalLayoutListener以獲取寬度和高度。 – oracleicom

回答

2

我能夠通過使用ViewTreeObserver解決此問題。

ViewTreeObserver vtObserver = view.getViewTreeObserver(); 
vtObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
     // check if the view's height and/or width > 0 
     // don't forget to remove the listener when done using removeOnGlobalLayoutListener 
    } 
}); 
0

我不確定這裏的答案是獲取屏幕尺寸,而是使用適當的佈局來縱向和橫向使用weight屬性來分配不同視圖之間的屏幕空間。

我相信你可以有一個容器佈局,可以承載其他片段佈局。

您可以在佈局xml文件中看到一些使用片段的簡單示例。

http://android-er.blogspot.com/2011/12/simple-exercise-of-fragment-inflate.html

這裏

http://portabledroid.wordpress.com/2011/04/19/programmatic-and-layout-fragments/

而且,看到不同的屏幕大小提供佈局此鏈接提示:http://developer.android.com/guide/topics/resources/providing-resources.html

我希望這點你在正確的方向。

6
DisplayMetrics metrics = context.getResources().getDisplayMetrics(); 
int width = metrics.widthPixels; 
int height = metrics.heightPixels; 
8

對於該縮放您可以通過以下操作實現:

DisplayMetrics metrics = context.getResources().getDisplayMetrics(); 
LayoutParams params = new LayoutParams(metrics.widthPixels * desiredWidthPercentage, metrics.heightPixels * desiredHeightPercentage); 

,然後應用PARAMS到你想要的視圖。

對於不同的方向,我建議使用在佈局和​​佈局,土地的文件夾不同的佈局或其他動態添加規則如下:

params.addRule(RelativeLayout.Above, ViewId); 

看到了規則的所有關鍵字,請參閱:http://developer.android.com/reference/android/widget/RelativeLayout.html

+4

不,這是一樣的。 DisplayMetrics包含顯示大小,而不是實際的活動大小。 – amik

-1

像其他人的建議,我會用每取向不同的佈局,只是處理它不同:

if(getResources().getBoolean(R.bool.is_land)){ 
    //Set up mapview on the side 
} else{ 
    //Add header to listfragment 
} 

使用布爾我n res/values-land