レイアウトXMLの LinearLayoutでorientation属性を書き忘れて
意図しない方向に配置され訳分からんことになったこと、
Android開発者のかなりの割合が経験しているのではないでしょうか?
今回はそれを防ぐ簡単な方法の紹介です。
やり方
(0)android.widgetパッケージを作る(必須じゃないです、別パッケージでもOK)
(1)該当パッケージにHorizontalLayoutクラスを作る
public class HorizontalLayout extends LinearLayout {
public HorizontalLayout(Context context, AttributeSet attrs) {
super(context, attrs);
super.setOrientation(LinearLayout.HORIZONTAL);
}
//他のコンストラクタも同じように実装する
}
(2)同じようにしてVerticalLayoutを作る
これだけです。
あとはXMLファイルに HorizontalLayout、VerticalLayoutを使って作成します。
こうするればorientation属性を書く必要がないので記入漏れを確実に防げます。
android.widgetパッケージに作成すると、
<HorizontalLayout .... >
というように、
パッケージ名不要、クラス名だけでXMLに記述可能というメリットがあります。
(いうまでもなくAndroid内部の実装が変わるとアウトです、自己責任で)
デメリットとしてはEclipse等でのグラフィカルレイアウトが正常動作しなくなりますが
自分はあまり使わない&自作Viewをよく使う都合で表示されないことが多く気にしてません
もう一つのメリット
また、縦と横でタグが別になるので込み入ったレイアウトファイルの可読性がちょっとあがります
<LinearLayout
orientation="vertical"
>
<!-- 他のView-->
<LinearLayout
orientation="horizontal"
>
<!-- 他のView-->
</LinearLayout>
</LinearLayout> <!--閉じタグが一緒。縦横どっち?-->
orientation属性を見ないと縦横判別できないのでXMLが長くなると面倒です。
今回作ったクラスに置き換えてみましょう。
<VerticalLayout
>
<!-- 他のView-->
<HorizontalLayout
>
<!-- 他のView-->
</HorizontalLayout>
</VerticalLayout> <!--閉じタグが別。かつ縦方向の終端とわかる-->
orientation不要、かつ縦横どっちの閉じタグかわかり読みやすいです。
まぁそこまで込み入ったレイアウトファイルなら include
を使うほうがいいかもですが...
ただ 記入ミスが防げる、タグ名だけで縦横の判別が可能 というのは意外と大きい効果があります。
単純にorientationを記入する手間も減りますし。
実装自体も非常にお手軽なのでぜひやってみてください。
より厳密にしたい場合、Horizontal(Vertical)LayoutのsetOrientationを呼び出すと例外を投げるようにしておくといいでしょう。