2012-11-06 32 views
3

首先關前,我一直在閱讀這個網站多年,它幫助我走出困境幾次,所以,謝謝你這裏的社區誰貢獻,並希望你可以幫我解決我自己的問題。Java的Android的:前處理的用戶界面會顯示

我只是在我的公司開始了與Android的發展,我試圖從端口的Windows Mobile C#到Android的Java現有的應用程序。大部分工作進展順利,但我遇到一些困難的一個領域是用戶界面。在創建時的WinForm從文件中的調查規範

Windows Mobile的應用程序讀取。在封閉式問題(例如多項選擇)的情況下,我需要爲規範中的每個適用答案填充一個CheckBox或RadioButton控件。創建所需的佈局和控件是沒有問題的,但我們也要求屏幕不滾動。因此,我們的軟件需要能夠在可用的屏幕空間內計算出最佳的可能性,而不會溢出(即1-4列用於顯示),然後才顯示出來。

我寫了我的用戶界面(至少佈局)作爲一個XML資源或Java代碼,但是因爲像GetWidth()和GetHeight()這樣的方法在onCreate()中返回0,所以我還沒有能夠添加這個需要的預處理。

所有這些都需要在屏幕顯示之前進行。如果任何人都能指引我正確的方向,我會非常感激。

回答

1

當Android的構建從佈局的UI,佈局的要求根它的所有孩子通過調用onMeasure報告其所需的尺寸()。它是否是自下而上的遞歸方式?如果有必要,父視圖會設置孩子的大小,以便他們適合。正如你所發現的,這個測量過程在onCreate()過程中沒有完成。

嘗試全局佈局偵聽器。

public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 

    // inflate your main layout here (use RelativeLayout or whatever your root ViewGroup type is 
    LinearLayout mainLayout = (LinearLayout) this.getLayoutInflater().inflate(R.layout.main, null); 

    // set a global layout listener which will be called when the layout pass is completed and the view is drawn 
    mainLayout.getViewTreeObserver().addOnGlobalLayoutListener(
    new ViewTreeObserver.OnGlobalLayoutListener() { 
      public void onGlobalLayout() { 
       // measure your views here 
      } 
    } 
); 

setContentView(mainLayout); 
+0

感謝西蒙!我現在可以讀取測量結果,但是我仍然不確定如何進行迭代,因此我可以測試適合度。所以,假設我有一個有20個可能答案的調查問題。我的應用程序將首先嚐試將該內容放入單列列表中。因此,如果我加載答案,在GlobalLayoutListener中測量它並確定它將溢出屏幕空間,那麼應用程序需要重置並嘗試使用2列重新顯示。爲了使事情進一步複雜化,答案文本可以被包裝,因此單個答案的高度不會是靜態的。 –

+0

我應該澄清一下:當我說列表時,我的意思是一個用RadioButtons或CheckBoxes填充的LinearLayout。 –

+0

線性佈局及其內容只有在使用列表或滾動視圖時纔會滾動,因此問題是如何調整所有內容的大小以適應內容。所以還有兩個問題。你已經有了邏輯,如何應用到Android視圖 - 以編程方式搜索「LayoutParams;如何測量文本。最好的解決方案是使用自定義類擴展textView並覆蓋onMeasure()和onDraw(),然後在onDraw()中使用幾種測量文本長度的技術,一旦測量完畢,調用requestLayout讓父母知道是否必須再次測量,然後再次調用onMeasure()方法 – Simon