2013年6月29日土曜日

左右にドロワーをもつDrawerLayout。できました。
左にNavigation Drawer。真ん中にコンテンツ。右にShortcutな使い方を考えました。

制御ばっちりのはずだよ!(泣

ポイントは
dispatchTouchEventでした。

今回の構造は、DrawerLayoutを親レイアウトとして上から順に、
メインコンテンツ用のFrameLayout、
左ドロワーをいれるFrameLayout(gravity:start)、
右ドロワーをいれるFrameLayout(gravity:end)となっています。

それぞれのFrameLayoutにFragmentをいれています。interfaceなどでイベントをFragmentとActivityでやり取りしてます。

これはActivityにDrawerLayoutをsetContentViewしているためです。そのためActivityで各ドロワーの制御を行うことになります。

それと右ドロワーのイベントは、左ドロワーのイベントが先に起こってしまいイベントが完結してしまうので、Activityから必要なdispatch系のメソッドを呼ぶことになります。

以上です。

2013年6月28日金曜日

というわけで左右に2つのドロワーがあるDrawerLayoutができました。
サンプル(masterブランチ)

バグ発見。右ドロワーが開いている時にドロワー内のViewがある領域をタッチイベントで拾えない。。。ちょこちょこ直します。

コードをきれいにしたいところですが、自分のアプリに取り込んで機会があればこちらで紹介します。
DialogFragmentを使う場合は、DialogFragmentのイベントをinterfaceでActivityに伝えてドロワーのopen/closeを制御してください。lockモードをいじればできるはずです。
DialogFlagmentを使う場合は、DialogFragmentのイベントをinterfaceでActivityに伝えてください。受け取った先でDrawerLayoutからRightDrawerの開閉を行う処理を付加すればいいはずです。Loaderの処理中、完了時も同じようにinterfaceでイベント通知する形になると思います。

2013年6月27日木曜日

左右に2つのドロワーをもつDrawerLayoutを作ってみました。
サンプル

可読性がアレです。
中身は次の通り。
ActivityやFragmentでイベントを共有したいときはinterfaceの引数に持たせたい値をいれて渡す。
右のドロワーはActivityで動作を制御。
ActionBarは各ドロワーの状態を確認して制御。
右ドロワーは直に、この場合だとFrameLayoutにonTouchで制御。
ドロワーの開閉時にActionBarDrawerToggleの中でロックモードを切り替えて制御。

ということをやっております。

課題としては、コードが汚い。きっとおれしかわからん。
右のドロワーが表示された時にactionbarの動作を変えたい。
右のドロワーの内容もぺちぺち変えたい。変えないならそのまま。
右のドロワーのタッチできる範囲を描画している範囲に変更したい。

以上です。

2013年6月25日火曜日

追記
DrawerLayoutを2つActivityにaddContentViewしても機能する。

左DrawerにAppコンテンツ。
右Drawerによく使うもの=actionbarに詰め込んでいるよく使う機能。
こういうこともできたりすると思う。
ちょろっとやったけど、制御がめんどくてやめた(ぁ

具体的には、android.r.id.content(Framelayoutだったりする)に対して、
左にドロワーをもつlayoutをaddContentView。
右にドロワーをもつlayoutをaddContentView。
メインコンテンツのFragmentを入れるFramelayoutをもつlayoutをaddContentView。

またぽつぽつやってみよう。
引き続きNavigation Drawerのお話。
ドロワーをFragment化、コンテンツもFragment化、actionbarのvisibleを制御なものを作ってみました。
サンプル(ブランチ:sample20130625)
2013/06/29追記
2013/06/29の記事にあるサンプルをお使いください。

interface万歳。これに尽きる。
actionbarのハンドリングもdrawerのイベントもinterfaceで受け渡し。
drawerから選択したitemを開くイベントもinterfaceでActivityへ。

画像サンプル
open時
close時

2013年6月20日木曜日

NavigationDrawerのleftDrawerの部分をFlameLayoutにしてListFragmentをいれてみました。

結果としては問題なし。

色々わかったこととしては、
1 menuの判定がめんどくさい
2 ドロワーレイアウトが開いているかいないかを常に確認する必要があった
3 ドロワー部分は単一のレイアウトグループの方がよさじ
4 Activityにもたせるものがわかりにくい

判定ではViewのDrawerLayoutやLeftDrawerをstaticにして参照させていたけど、
DrawerLayoutのリスナーでopen/close時にBundle投げたほうがいいかもしれない。

それとActivityにあるものをやたらめったら参照する必要があるので、staticになりがち。
それと可読性がちょっとアレ。でもAcitvityのクラスにまとめて入れておかないと何かと不便。

actionbarでひたすら難儀した。
最初は、LeftDrawerにいれたListFragmentのactionbarの状態をデフォルトにしたかったのだけど、
考えてみればドロワーが開いたときのメニューってアプリのデフォルトのメニューだった。
「アプリの」ってことはActivityに持たせたほうがいいかなということで変えました。
onPrepareOpitionsMenu()とかinvalidateOptionsMenu()とか初めて使いました。
menuのsetVisibleがあまり効かなかったので、結局menu.clear()になりました。

2013年6月18日火曜日

navigationdrawerをつかったサンプルを作ってみた。
デモの通りだと左だから右にしようと思ってやってみた。
LayoutファイルのListViewのGravityをendにすると右から出てくる。ほんとそれだけ。
サンプル

でもtopはだめだった。bottomもきっとだめなんだろう。

ListViewのGravityをjavaで動的に変更するやり方をご存知の方がいらっしゃいましたら、
コメントでこっそり教えてください。

2013年6月10日月曜日

ほむぺからブログへ

ブログってやったことないけどとりあえず書けばいいのよね。

Navigation Drawerってのがでたのでそれをつかったアプリを作ってます。

・・・以上。いいのかこれで。