2014年4月20日日曜日

Genymotionを導入してみた

eclipseのエミュレータでandroid4.4.2のテストをしたかったのだけど、
どうにもこうにもTheme.Holo.Light.NoActionBar.TranslucentDecorの状態が作れなかった。スキンに問題あるのかな。

そんなわけでGenymotionを導入してみました。
試してみたところTheme.Holo.Light.NoActionBar.TranslucentDecorが反映されていることが確認できました。しばらく使ってみよう。
4.4の実機がほしいです。

4.4のアクションバーも含めて透過

ぼへーっとStackOverFlowを見てたら面白そうなのがあった。
http://stackoverflow.com/questions/19746943/why-cant-we-use-a-translucent-system-bars-with-and-actionbar

アクションバーも含めて透過してる。
からくりとしてはアクションバーの背景を透過する。
んで、activityの一番上のレイアウトに色をつける。
そうするとその一番上のレイアウトの色がステータスバーとアクションバーの背景として見える。

おもしろいけど、個人的にはちょっと見づらいかな。
でもアプリのカテゴリーを表示する色として使うとかならありなのかなぁ。

2014年4月18日金曜日

というわけで

ステータスバーがレイアウトに被るような場合のレイアウトのサイズが見れるものを作ってみた。
https://play.google.com/store/apps/details?id=ahscode.statusbaronscreen
https://github.com/ahscode/teststatusbar

androidのdimenのapilevel15~19を確認したけど、公式ではステータスバーの高さは25dipだった。
マージンなりパディングなりは25dipでとれば大丈夫そうだけど、滲んだりするといやだから追加で8dipくらいとればいいのかな。

kitkatの実機がほしいです。

2014年4月17日木曜日

kitkat対応

盲点だった。

kitkatでは新しいテーマで
android:style/Theme.Holo.Light.NoActionBar.TranslucentDecor
というのがある。
こいつはステータスバーが透明になる。
かつ、Viewのコンテンツ領域がDisplaySizeと等しくなる。
そしてコンテンツ領域に被さるようにステータスバーがある。

この被さるというのを考えてなかった。
コンテンツ領域がステータスバーに被ってしまう。

じゃあ、他のバージョンもこれに似た状況にしないとね。
というわけで、ActivityのsetContentViewの前に、

というのを呼び出すと、ステータスバーがコンテンツ領域に被るようにできる。
他のバージョンでも透明になったらいいのになぁ。

2014年4月16日水曜日

FragmentPagerAdapterで登録しているFragmentの完全取得

ViewPagerのアダプターにFragmentPagerAdapterを使っている場合、
mAdapter.getItem(int position)で返ってくるFragmentはその実体ではない。
具体的に言うと、メンバ変数として登録したレイアウトなどへのアクセスが全てnullになる。
staticなものとかfinalは試してません。

じゃあ、どうやってアクセスするの?
ということで、surpportv13にある実装を見てみる。
コンストラクタのFragmentManagerを使って内部でタグをつけてaddしていた。

そんなわけで真似して呼んでみたらnullじゃなかった。
FragmentがもつViewの入れ替えもできた。

なんだろう。こう、もにょる。
それなら自分でsupportv4のPagerAdapterを拡張しておれおれFragmentPagerAdapter作ったほうがいいような気がしてきた。

全部のFragmentを必ず最初にattachしてonCreateは呼ばせたいが、そうなると今度はViewPagerの根本的な拡張になるんだろうなー。

具体的にはこんな感じで試してみました。

2014年4月15日火曜日

とあるDragAndDrop

ドラッグアンドドロップのやっているところで簡単なテストアプリを作ってみた。
onDragListenerのテストでございます。
やりたいことは、
・レイアウト内にあるViewを他のレイアウトにドラッグアンドドロップする
こんだけ。

で、試しにやってみたところうまくいかなかった。
エラーで、
 E/AndroidRuntime(12379): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

これが出る。何ぞこれ?と思って調べたところ、
Kazzzの日記 Viewの階層を入れ替える
http://d.hatena.ne.jp/Kazzz/20100603/p1
というサイト様で図解が出ていた。

ほむほむ。
親との縁を切れと(違

冗談はさておき、元のparentとの関係を無効(removeView)にして宙ぶらりんにした後、
新しい親に加わえる(addView)。invalidateではだめでした。

最初はアニメーションの関係かなぁと思ったのでpostDelayしてみたりしたがだめでけっこう行き詰ってました。だってview init<うんたらかんたら>とかいうエラーが出たし。
さらにMainActivityの匿名クラスでやってたもんだから、参照がわけわかめになっていた。

そんなわけで、匿名クラスを全部外に出し、やりとりは全て独自インターフェイスにして、必要なものだけActivityのメンバ変数にした。

以下ソース。


2014年4月13日日曜日

GridLayoutを均等にしてみるテスト

均等にするのってめんどくさそうだなーと思いながらカスタムビューを作ろうとして、
既存のウィジェットでできないもんだろうかと思ったのでやってみた。

どっかでワンクッションを置く感じで透明な状態で使いたいサイズで組み込んでおけば、あとから使いたい実数値も取れる。
例えば、始める前に「Hi! this app is うんたらかんたら Okボタンを押すと始まるよ!」とかいう画面を入れてみたり。んで、永続データに突っ込む。
ボタンをタップもしくはクリックするとこんな感じになります。
階層は、
RelaitiveLayout
 LinearLayout
  ボタンとView
 RelativeLayout
  RelativeLayout(ポイント1)
   GridLayout
と言う感じです。
このポイント1を入れたのは、当初はそのままGridLayoutを入れていたのですが、Gravityをいじってみたりしたけどだめで、そもそもこいつはどこを基点としているのかなーと思い試しに囲ってみたらうまくいきました。
ちなみにGridLayoutのRelativeLaytoutの関係は、
android:layout_centerInParent="true"になっています。
これプラスAlignParentTop = "true"にすると上ぴったりになります。

以下ソース。レイアウトとjavaを置いておきます。気が向いたらGithubに突っ込んどきます。

2014年4月11日金曜日

画面遷移について

fragmentのバックスタックやActivityの遷移などをいれるとどうしても画面がちらつく。
目には負担でしかありません。見たくなくなります。
UXの話になるけども、目が辛くなるような遷移はだめだと思う。

ソフトにすることも可能だけど、本体設定の開発者向けのオプションからアニメーションをカットして通常使用している場合、アニメーションの効果は薄くなる。

じゃあ、どうするかというと設計を見直す。これに尽きる。
えーやだー。
がんばります。

2014年4月6日日曜日

NoUIFragmentの使い所

FragmentはUIを持つものとUIを持たないものがある
ご存知の方も多いと思う。

このUIを持たないFragmentは使い所でちょっと厄介なところがある。
Activityの遷移が絡む場合だ。

永続データをキーにするならまだしもBundleであれこれやろうとすると失敗する。
Loaderの戻り値をBundleに入れて、NoUIFragmentからActivityの再起動を試みたところエラーが出た。Activityのライフサイクルにひっかかったようだ。
ランチモードはデフォルト。使用したメソッドはActivityクラスのrecreate()。

試しにNoUIFragmentではなくActivityのonActivityResultでrecreate()を使用したところ、Bundleの値を保持してonCreateが呼ばれた。

Activityの遷移が絡むところではNoUIFragmentは避けようと思った。

以下、おまけ。
テストで使ったBundleを保持できるActivityの再起動のソース。

2014年4月2日水曜日

備忘録:GridLayoutを動的に作る