i++

プログラム系のメモ書きなど

Android

Android : Overflow Menu で表示されるメニューに Horizontal の ImageButton 列を表示したかった(Chrome みたいに)

この画像の、メニュー上部に戻るボタンやお気に入りボタンが並んだものを作ろうとしたわけですが… 方法 具体的な方法は調査中であるものの、どうやら PopupWindow もしくは ListPopupWindow を使ってゴリ押しで実装するしかないようです。 あまり面倒なこと…

Android : Runtime Permission 対応

Android 6.0 (Marshmallow, API level 23)に導入された Runtime permission に対応しようと思って調べたところ、インターネット接続に利用していた ACCESS_NETWORK_STATE と INTERNET は自動でパーミッションが付与される Normal Permissions という種類の権…

Android : gradle で定義された versionName を string リソースとして利用する

Android アプリではバージョン情報として versionCode と versionName があり、以下の様な形で gradle (app) で設定します。 defaultConfig { applicationId "com.example.increment" minSdkVersion 21 targetSdkVersion 23 versionCode 1 versionName "0.1"…

Android : Error:Execution failed for task ':app:packageRelease'. > Unable to compute hash of .... build\intermediates\classes-proguard\release\classes.jar

ProGuard を有効にした Signed apk を作成しようとした際に発生しました。 Error:Execution failed for task ':app:packageRelease'. > Unable to compute hash of (プロジェクトのフォルダ)\app\build\intermediates\classes-proguard\release\classes.jar …

Android : java.lang.RuntimeException: Missing type parameter (ProGuard + gson)

原因は gson を使っていた + gson 用の ProGuard の設定をしていなかったことでした。ProGuard によって難読化されたことで serialize / deserialize 対象のタイプ、クラスが正しく参照できなくなってしまい例外を引き起こしていたようです。 参考先の progu…

Android : android.view.InflateException: Binary XML file line: Error inflating class android.support.design.widget.NavigationView

今回の NavigationView については自分の場合は ProGaurd が原因で、以下の行を proguard-rules.pro に書き加えることで、実行時に表題の InflateException が発生することはなくなりました。 -keep class android.support.v7.widget.LinearLayoutManager { …

Android : Overflow メニューにアイコンを表示する

Overflow メニューに入れられたメニュー項目はそのままではアイコンが表示されませんが、以下の方法でアイコン表示を行うことができました。 コードで実現するバージョン 利点 標準的なメニューの見た目、挙動を保てる 欠点 Reflection を使用しているので将…

Android : Can't bind to local 8600 for debugger 確立された接続がホスト コンピューターのソウトウェアによって中止されました

AndroidStudio でアプリを実機デバッグしようとした際に遭遇しました。 デバイスを抜き差しするだけでは直らず、 デバイスの USBケーブルを抜く AndroidStudio を終了する Waiting for process detach ダイアログが終わらなかったので強制終了 AndroidStudio…

Android : SwipeRefreshLayout の更新中 Indicator を起動時に表示する

onCreateView で直接 SwipeRefreshLayout.setRefreshing(true) をしても表示されないので、post を使って少し遅らせてから refreshing が true になるようにします。 SwipeRefreshLayout の onMeasure が呼ばれて、サイズが確定してから refreshing を true …

Android : WebView 覚え書き(ズーム関連の機能の有効化、Progress の表示、Back Key のハンドリングなど)

やりたい事 方法 ピンチ操作によるズームイン / ズームアウトの有効化 webview.settings.builtInZoomControls = true ダブルタップによるズームイン / ズームアウトの有効化 webview.settings.useWideViewPort = true ズームボタン(右下に表示される±のルー…

Android : SwipeRefreshLayout で ListView に EmptyView を設定すると ListView が空の時に Refresh 表示が上手くされない問題を解消する

ListView.setEmptyView で Empty View を設定していると、ListView が空の状態で SwipeRefresh (PullToRefresh) を実行すると Refresh の Indicator (上の方でくるくる回る、setRefreshing でコントロールされるもの)が、更新が終わった瞬間辺りに一瞬表示…

Android : Warning:Conflict with dependency 'com.android.support:support-annotations'. Resolved versions for app (23.1.0) and test app (22.2.0) differ.

エラーメッセージ全文は以下のとおりです。 解決のために参考となる URL が記載されているなんて素晴らしい! Warning:Conflict with dependency 'com.android.support:support-annotations'. Resolved versions for app (23.1.0) and test app (22.2.0) dif…

Android : SlidingTabLayout を使う + タブの幅をウィンドウ幅に合わせる

SlidingTabsBasic | Android Developers のコードをダウンロードして(右上のボタンで可能)Android - SlidingTabsBasicをプロジェクトに導入する - Qiita に沿って適宜ファイルをコピーしていけば SlidingTabLayout を使えます。 ただし、SlidingTabsBasic …

Android : ListView (ArrayAdapter) で使う View に RadioGroup.setOnCheckedChangeListener を使うと起こる問題について

原因や問題が起きる条件が全く解明できていないものの、ひとまずメモ。 ListView で表示する項目の View に RadioGroup を含める その RadioGroup に setOnCheckedChangeListener を設定し、その中でデータ(getItem(position) で得られるもの)を変更する …

Android : Toolbar + DrawerLayout で Drawer を一時的に無効にして Navigation Icon (homeAsUpIndicator) を変更する

ActionBarDrawerToggle.setDrawerIndicatorEnabled(false) で「ハンバーガーアイコン + Drawer の開閉」を無効にすると、 setToolbarNavigationClickListener で設定したリスナーが呼ばれるようになる Toolbar.setNavigationIcon で Navigation Icon (左上の…

Android : Warning:Conflict with dependency 'com.android.support:support-annotations'. Resolved versions for app (22.2.1) and test app (22.2.0) differ.

Espresso が 22.2.0 を必要としていてそれが conflict を招いているので gradle で ResolutionStrategy を設定して解消します。 Warning:Conflict with dependency 'com.android.support:support-annotations'. Resolved versions for app (22.2.1) and test…

Android : NavigationView の menu にセパレータを表示する

group でまとめて、group に固有の id を設定すると前後に横線が入ります。 <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/drawer_navigation_home" android:checked="true" android:icon="@drawable/ic_home_grey600_36dp" android:title="@string/home"/> </item></menu>

Android : NavigationView の headerLayout の RippleEffect を消す

クリックイベントを設定していない、ディスプレイ用のヘッダーでもクリック時に RippleEffect が表示されます。 これを消すには、headerLayout に設定したレイアウトの親要素に android:id を設定し、headerLayout に setOnClickListener を付ければ OK。 逆…

Android : SearchView に独自の CursorAdapter を設定する

幅広く独自のレイアウトで検索候補を表示できるようになるので使い勝手が良さそうです。 // bindView をオーバーライドしているので SimpleCursorAdapter のコンストラクタの String[] from は使っていない気がするのだが、null にすると動かない mSearchVie…

Android : SQLite で Cursor の Column を別名で返す

SQLiteOpenHelper (SQLiteDatabase) を使っているデータベースを持っている そのデータベースのテーブルを使って SearchView に検索候補を返したい しかしテーブルのカラムには SearchManager.SUGGEST_COLUMN_TEXT_1 がない! という場合などに使います。 具…

Android : Toolbar のスタイル(背景とテキスト)を変える

背景色は Toolbar の android:background で、テキストの色とシステムアイコン(オーバーフローアイコンやハンバーガーボタン)の色は app:theme で変更します。Application 本体の Theme から変更する場合に使います。 テキストのスタイルを細かく変える場…

Android : SearchView に独自の検索候補を表示する

Adding Custom Suggestions | Android Developers からのメモ書き。 表示する検索候補をコントロールするために ContentProvider を実装する以外、検索履歴を表示する場合とほぼ変わりません。 ContentProvier を実装する query (と onCreate)だけ実装すれ…

Android : Guava を使うための build.gradle の設定

Guava は Google製の Java 用ライブラリ。 Android プロジェクトで使用するには build.gradle (Module: app の方)の dependencies に 'com.google.guava:guava:18.0' を追加します(バージョンはこの記事を書いた時点のもの)。 dependencies { compile file…

Android : SearchView に検索履歴を表示する

Adding Recent Query Suggestions | Android Developers からのメモ書き。 ドキュメントに沿って書けば問題なく動くはずなので、表示されない場合は各所に設定する Authority の文字列や タグに設定する android:name の値を確認しましょう SearchRecentSugg…

Android : SearchView での検索時に追加の情報(Context Data)を渡す

SearchDialog 使用時には、検索を実行する Activity の onSearchRequested() をオーバーライドしてその中で Bundle にデータを入れる方法が記載されていますが、SearchView (SearchWidget) の場合の実装方法は記載がありません。 いろいろ調べた結果、Search…

Android : NavitagionView (DrawerLayout の Drawer) をフルサイズ(画面の高さに合わせて)表示する

アプリ領域全体だけで良い = システムのステータスバー(アンテナとか電池残量とか表示している部分)にオーバーラップしなくても良い、という場合は Toolbar を使うだけで OK です(逆に Toolbar を使う場合に Drawer を被せないようにする場合、Layout に…

Android : DrawerLayout と Toolbar の組み合わせで、Toolbar が画面全体に広がってしまう

DrawerLayout は1つめの子ビューをコンテンツ、2つめの子ビューをドロワーとして扱い、それぞれ自動的に match_parent に設定するため、View の構成を間違えているとそのような事が起きる模様です。 DrawerLayout を使う場合、View の構成は基本的に以下のよ…

Android : SearchView を入れたダイアログで、キーボードを閉じた時にダイアログ自体を閉じる

SearchView#setOnQueryTextFocusChangeListener で hasFocus が false の時に Dialog#dismiss することで実現します。 通常は、1回目の BackKey でキーボードが閉じられるとともに EditText 部分がフォーカスを失い、2回目の BackKey でダイアログが閉じる、…

Android : SearchView を含むダイアログ起動時にキーボードを自動で表示する

Dialog#setOnShowListener にキーボードを表示するコードを入れます。 // AlertDialog.Builder の Create で Dialog を作成 // Dialog にセットした View に SearchView があり、 // mSeachView として変数に保存しているものとする dialog.setOnShowListene…

Android : SearchView の hint が表示されない

searchable.xml の android:hint に直接文字列をハードコーディングすると、SearchView が空の時に表示されるはずのヒントテキストが表示されません。 @string/search_hint などの String リソースを定義して、それを参照する必要があります。 OK