2012-11-04 93 views
3

請查看此xml佈局。由其父母剪裁的完整尺寸的Android視圖

<LinearLayout android:id="@+id/dataTableContainer" 
        android:orientation="vertical" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:clipChildren="true"> 

     <LinearLayout android:id="@+id/dataTable" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:orientation="vertical"/> 

    </LinearLayout> 

在運行時,「dataTable」元素填充的子元素比「dataTableContainer」可以顯示的要寬。然而,當我在eclipse中檢查兩個元素的mMeasuredWidth(或者甚至是getWidth()的返回值)時,它們變得完全相同。這不應該是這樣。我的理解是,「dataTable」的孩子應該通過「wrap_content」設置來推動它自己的寬度。相反,「dataTableContainer」應該小於此值,因爲它的「fill_parent」設置受到屏幕大小的限制。

我也嘗試將「clipChildren」設置爲false,以防萬一寬度被容器剪裁但結果保持不變:表和容器的寬度都相同。

任何人都可以解釋發生了什麼?

爲了給你一些背景,我想要做的是收集這些元素的大小,以確定有多少「dataTable」元素位於容器外側,因此看不到。這又需要限制用戶可以拖動表格元素的距離。 ScrollView元素本身限制了運動,但是因爲我使用的是LinearLayout,所以我需要複製該限制功能。

+1

內部'LinearLayout'不能大於外部大小,因此寬度相等似乎是合理的。你真的需要根元素是一個'LinearLayout'嗎?你可以在'ScrollView'中包裝dataTableContainer嗎? – acj

+0

感謝您的評論@acj。我認爲假設內部元素不能大於外部元素是很安全的。當然,它不能,但在內部,我會認爲渲染引擎知道(並存儲在某處)內部元素想要更大但被外部元素剪切。因此,我期望測量的寬度與getWidth()返回的值之間存在差異。 – manu3d

+1

要回答你的問題@acj,我不能使用ScrollView,因爲我試圖創建一個簡單的2D ScrollView,一個可以水平和垂直滾動的滾動視圖。我已經看到了解決方案,但他們似乎有點矯枉過正,我需要做的事情。拖動內部元素已經工作,但我不知道如何限制它的運動,使它不會離開屏幕! – manu3d

回答

2

看來我太信任Eclipse了。在使用斷點調試來檢查應用程序的狀態和許多可用變量的值時,我依賴於eclipse提供的變量列表,其中包括mMeasuredWidth/mMeasuredHeight。請注意,這些不是來自我的源代碼的變量。 Eclipse以某種方式自己找到它們,爲我檢查對象。因此,我認爲他們確實代表了測量的寬度/高度。然而,我的假設是錯誤的,如果僅僅因爲一個視圖可以用不同的方式測量(即使用MeasureSpec.UNSPECIFIED或MeasureSpec.EXACTLY)並且eclipse無法知道我需要哪個測量。

我因此觸發我需要加入到我的代碼測量:

int measureSpecParams = View.MeasureSpec.getSize(View.MeasureSpec.UNSPECIFIED); 
dataTableView.measure(measureSpecParams, measureSpecParams); 
int measuredWidth = dataTableView.getMeasuredWidth(); 
int measuredHeight = dataTableView.getMeasuredHeight(); 

這也給我的視圖大小我之後,即「dataTable的」視圖會多大,如果父視圖,也不屏幕限制了它。

相關問題