2013年7月9日火曜日

[安藤]android view / layout 的兩三事

想到會隨時更新。
整體Layout的調整:
  • Margin影響的是與上一層layout的距離。但是listview除外。
  • Layout_Gravity是指該Layout在上一層layout所偏重的位置。
  • layout_weight是以倒數的方式來判斷。 0=無限大,同一層的其他widget都會被蓋掉而消失。數值越大,佔的權重越小。
  • 使用imageview或是textview當作onclick的觸發條件,而且該view的長寬小於40dp的話,建議指定view padding,可達到加大該view的可按範圍的效果。


關於TextView:

  • 自動換行:parent要固定長度(match_parent也可),設定single_line為false, layout_weight要指定一個數值。
  • 用code設定layout_weight的方法為xxxxx.setLayoutParams(new LayoutParamsLayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT, 1f));
  • 不希望文字過多的時候會自動換行的話,Padding不要指定left跟right。文字過多時會切字。


關於listview:
  • cell之間需要空隙,發現指定最外層layout的padding沒用的話,可以在cell layout的最外層再套另一個layout,然後指定原本的最外層layout的margin.
  • setHeaderLayout / setFooterLayout 要在setadapter之前,要不然不會顯示
  • 滑動的時候偶而會出現黑底的問題:在listview的properties加上android:cacheColorHint="@color/transparent"
  • 讓listview點選的時候不會反白:android:listSelector="@color/transparent" 
  • 在cell上面的view object掛上onclicklistener之後,listview的onitemclicklistener失效: 在cell的root layout上面加上這個參數:android:descendantFocusability="blocksDescendants"或是直接改採在root layout上面掛onclicklistener的方法解決。

關於Fragment:
  • 頁面的layout xml檔案內容請勿直接擺一個widget。最外層一定要指定一個Layout。

關於scrollview
  • 建議不要直接當activity的root用,前面套一個layout才能自動調整垂直scroll的長度。
  • scrollview下一層的layout,其margin的設定是不會有作用的。請再套一層layout去設定margin。
  • 頁面有EditText等等會彈出輸入框的Layout,即使不會scroll,都強烈建議套上scrollview。這樣輸入框彈出的時候,layout可以捲動,不會導致layout下半部的輸入框無法輸入。

關於edittext:

  • 防止autofocus: 在上一層layout指定下面兩個參數:
    android:focusable="true" android:focusableInTouchMode="true"
  • 單航,游標自動游移:在android 6.0以後,andrid:singleLine的參數被停用。之後要靠設定「android:maxLines=1」還有設定「android:inputType="text"」跟「android:nextFocusForward=widget id」來啟用鍵盤的enter自動跳下一個EditText的動作。

RelativeLayout:
  • 作為定位點的widget要寫在前面。要不然指定相對位置的參數的時候會抓不到widget。(相對id:  「@id/xxxx」。 可以改採絕對id「@+id/xxxx」就可以避開layout描述順序的問題)
  • 從重要的定位點開始layout,依序描述。到最後就可以採用match_parent擺定位置。
  • 尤其是中分型的design最為好用,可得奇效。
  • 要讓widget的高度自動拉長,有時高度指定為match_parent會得不想要的效果(或是android studio顯示正確,但是實機上面顯示錯誤)。建議指定高度為wrap_content,先定義一個需要的高度的元件,然後指定layout_alignTop跟layout_alignBottom都是這個元件。此問題經確認是android 4.4.4版本以前的手機會產生。
  • layout_centerInParent這個屬性在某些手機上面會把toLeftOf / toRightOf / toStartOf / toEndOf等等屬性給吃掉。請小心使用或是改用layout_centerVertical / layout_centerHorizontal 。

RadioGroup:

  • 等同於LinearLayout。可用等分的方法去指定radiobutton的位置,不需使用過大的layout_margin導致在螢幕較小的device上面會跑版。