Androidのアプリ開発関連のブログ

データベースマネージャ配信した

制作していたSQLite用のデータベースマネージャ配信した。


配信してから1回更新したが、AdMobの登録のためと、1箇所EditTextのheightがmatch_parentだとAndroid-x86でhintがずれちゃってたんでwrap_contentに変更した。

あと、戻るボタンで戻ることが多いアプリだが、戻った時に基本画面が更新されているべきだと思うが現状されてない。
onCreateで処理しているが、表示内容に影響する部分はonResumeに変更したほうが良さそう。
そうすると、Viewを削除してから挿入し直さないとだめな感じかな。
ってなところを、もう一回更新するかも。


今年は既に2個のアプリを配信したが、やる気が途切れぬうちに次もやりたいんで、既にプロジェクト作った。
次回はSSHコンソールをやる。
ただ、技術的に完全に把握していないので断念する可能性はある。
SSHの通信はSFTPのときにも使ったJSchでやるつもりだが、要求に対して応答が返ってくるFTPとはだいぶ違うはず。
前に制作考えた時はnanoとかtopみたいに画面を選挙するコマンドの仕組みがわからなかったが、恐らくASCIIコードの制御コードが飛んでくるんだと思う。

技術的な面や難易度的に難しいと思うのだが、SSH以外にもいくつか構想はある。

もうじき完成

アプリ内購入の実装やった後は2週間SQLiteのデータベースマネージャを作っていたのだが、
今週末までにできればと思っていたが、機能の実装は今終わった感じで予定通りに終わりそう。

なのだが、SQLiteはAPIで普通に使えるから簡単だと思ってたので、
まったりペースで2週間のつもりがレイアウト周りが大変で、結構ガッツリやった。
SQL文の入力は大半がダイアログに入力する仕様にしたが、命令ごとに違う複雑なViewGroupになるんで、
レイアウトファイルが今までのアプリは縦横合わせて10個程度だったが今回は縦画面だけで30個行った。

難しかったと思うのは、前回の記事に書いたがTableLayoutが初めてだったのでborderの付け方とか、
LayoutInflater.inflate()を多用したが、第3引数がtrueの時とfalseの時で戻りが違うのと、
最後今日やったところだが、Spinnerで初めて動的に子要素入れたのだが、難しかった。

Spinnerをリソースファイルから固定で入れるのは簡単だが、動的に入れる場合は、
Spinner.setAdapter(SpinnerAdapter adapter)
でAdapterを入れるのだが、
SpinnerAdapterというやつはAdapterにabstractメソッドが1つ追加されてるだけで、Adapterの方にも大量にabstractがあるので、
自力でSpinnerAdapterのメソッドを実装しようと思ったらかなり大掛かりになる。
ArrayAdapterを使うのが楽そうだったのでそうしたのだが、ArrayAdapterのコンストラクタは全部レイアウトリソースが必要。
Spinnerに入れるTextViewを一個用意したいだけなのにレイアウトリソースで用意しないといけないのね・・・


あとは、機能自体は完了したと思うが、メニューをいくつか付けたり、
アイコンとか宣伝画像の作成、いつも通りAdMobつける。
ってな感じかな。

TableLayoutにborderと、LayoutInflater

今作ってるAndroidアプリで表を使いたいのでTableLayoutを使っているのだが、
TableLayoutにはborderをつけるような機能はないのね。めんどい。

HTMLの<table>でもフラットな線を引きたい場合や枠染色を指定したい場合によく使う方法だが、TableLayoutにborderを付けたい場合は、
TableLayout自体に枠線色となる色で背景色を指定し、各セルとなるViewの背景色を通常の背景色に指定して枠線幅分のmarginをつける。
という感じになる。


TableLayoutにborderをつけるにはそんな感じなのだが、今回の場合は表は動的に作るのでLayoutInflaterを多用している。
XMLで表をすべて作る場合は問題ないのだが、LayoutInflaterを使う場合、
inflate(int resource, ViewGroup root)
を使って第2引数をnullにする場合が多いと思うのだが、
第2引数のViewGroupは親要素なので、これがnullだとXMLにレイアウトパラメータが指定してあっても親要素依存の項目は無効化されてしまう。
第2引数で親要素を指定した場合は親要素依存のレイアウトパラメータも有効。

LayoutInflater.inflate()には、
inflate(int resource, ViewGroup root, boolean attachToRoot)
3引数タイプのものもあるが、2引数タイプのもので親要素を指定した場合はattachToRootがtrueの場合と同じ模様。
ここのattachToRootなのだが、trueにするとViewはinflate()で作成された時点で第2引数の親要素にaddView()された感じになるのでtrueだと便利。
なのだが、どうもinflate()で戻ってくるViewは、ここでattachToRootがtrueで挿入された場合は作成された子Viewではなく親要素が返ってくるみたい。
なので、挿入する子要素に対して処理を行いたい場合はattachToRootをfalseにして戻り値の子要素を取得してから別途addView()をした方が良さそう。

Genymotionを利用する

Genymotionは、Virtualboxと連携して動作するx86ベースのAndroidエミュレーターです。
x86ベースですのでハードウェア仮想化支援が利用できれば快適な速度で動作します。
Android-x86と違いVirtualboxの「マウス統合」機能が利用できます。
また、デバイス回転や電源等のボタン類が表示されて便利です。
Google Playは入ってないので必要なら追加インストールが必要です。
ゲームなどのOpenGLを利用したアプリは動かないようです。

https://www.genymotion.com/
公式サイトは上記になり、フリーではないのでアカウントの登録が必要です。個人利用なら無料です。
Arch Linuxの場合はAURにパッケージがあるので、そちらからインストールできます。
Virtualboxと連携して動作するものなので、別途Virtualboxが必要です。
GUIアプリがインストールされますので、Genymotionを起動してデバイスを作成するとVirtualboxにゲストが作成されます。
VirtualboxのゲストはGenymotion上から起動できます。