Android

Abstract#

Android プログラムを実施した際に、覚えておきたいと思ったTIPS。

Topics#

画面デザイン#

  • 画面の一番上にあるステータスバーの下にあるのが、タイトルバー。これを消すのもstyle.xmlとそれを呼び出すManufest.xmlの設定[5]
  • 起動画面のことをスプラッシュスクリーンというらしい。デザインをかっこよくしたいが。。。[4]
  • ステータスバーの色
画面の一番上にある時間とか通知とか電波状態とか電池残量などが表示されるバーのことをステータスバーといいます。その色を変えるには、style.xmlに
<item name="android:statusBarColor">@android:color/black</item>
を追記しましょう[11]

画面遷移#

  • 起動時の画面
Manufestのアクティブティの宣言するところで指定しましょう[13]。これを複数のActivityに設定してしまうと、インストール時に表示されるアイコンが複数になってしまったりして、かっこ悪いので気を付けましょう。
  • 前段
nav_graph.xmlで各Fragmentのアクションとして、遷移を定義しておきましょう。あと、最初の画面がどこか定義しておきましょう[9]
  • Fragmentから別のFragmentに
NavHostFragment.findNavController(MainFragment.this)  
.navigate(R.id.action_MainFragment_to_DistFragment);
これをFragmentから呼び出します。シンプルですね。
  • Activityの中から表示しているFragmentを遷移
NavHostFragment navHostFragment = 
(NavHostFragment)getSupportFragmentManager()
.findFragmentById(R.id.nav_host_fragment);
NavController navController = navHostFragment.getNavController();
Fragment fragment = navHostFragment.getChildFragmentManager().getFragments().get(0);
if(fragment instanceof MainFragment) {      
navController.navigate(R.id.action_MainFragment_to_SettingFragment);
}else if(fragment instanceof MapFragment){    
navController.navigate(R.id.action_MapFragment_to_SettingFragment);
}else if(fragment instanceof CameraFragment){    
navController.navigate(R.id.action_CameraFragment_to_SettingFragment);
}else {
    //no action
    }

ちょっとややこしくなってますが、やっていることは画面遷移を見えないところで操っているNavHostFragmentを見つけて、その子供となっている実際に画面に映っているFragmentを見つけて(ここ結構検索しました。。。[10])、そのFragmentにより、遷移先をnav_graph.xmlで定義したActionから引っ張ってくる感じです。

ファイルの扱い#

  • ファイルの認識
カメラを使って画像を作った後、なかなかファイルとして見つからず、一日後にファイルとして認識されるという事象がありました。それは、[7]で出てくるContentResolverでinsert() とそれに必要なvalueの指定を入れることで解決。詳細はGNSSFinderのソースを見てください。
  • Assetsフォルダ
ローカルに設定ファイルを保存したいときは、Assetsフォルダを作りましょう。Android Studioからであれば、File->New->Folder->Assets Folderとやります[3]。ファイルにアクセスするときはAssetsManagerを呼んで、OpenメソッドでInputStreamが得られます。
  • Rawフォルダ
ローカルに動画ファイルを置くときに使ってみました。resフォルダの下にrawフォルダを作っておいて[8]、動画ファイルを以下のURIで呼び出せます[14]
Uri uri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.background_video);
''''
  • いろいろ
例がたくさん並んでいそうなページ発見。プログラムでSDカード上に画像ファイル作ってもなかなか識別されないからここ[6]にあるMediaScannerConnection.scanFileやらないとかも。今のところ不要か。

その他#

独立
  • AsyncTask
we cannot connect to Internet from UI thread. Let us use AsyncTask![2]
  • ギャラリーの共有からアプリを起動したい
スマフォからもっと楽に写真をJSPWikiにアップロードしたい。その時に参考にしたサイトがhttp://shokai.org/blog/archives/5401[1]
しばらくAndroidで位置情報を扱うプログラムを作っていなかったら、APIの使い方とか変化していた。ちょっとやってみます。
方位センサ、重力センサでノイズをひろってARの時にブレブレになる。何とか解決したいが。
Android Sensor Levelingで解決。これはやるべき。
  • アイコン
デフォルトで用意されているアイコンがあり、画像をdrawableフォルダに入れなくても呼び出すだけで使えます。https://sites.google.com/site/technoute/android/icon/drawable
ここ便利です。http://android-ui-utils.googlecode.com/hg/asset-studio/dist/index.html
2021年5月29日時点ですが、最近はadaptive iconらしいです。やり方は、Android Studioに書いておきました。
  • アクションバー(ActionBar)
どうもAndroid 3あたりから導入された機能らしく、いろいろメニューを表示するときに便利です。自分の場合は、上のバー上に拡大ボタン、縮小ボタンを追加したかったのです。メニューのXMLに普通に追加して、ShowAsActionでAlwaysにすることがポイントみたいです。
http://techbooster.org/android/ui/3383/
  • カスタムView
FragmentにカスタムViewをFragmentクラスの中で生成して追加していたら、いつの間にか、FragmentContainerViewというものがLayoutの代わりに使われていて、それにViewを追加しようとすると、FragmentとAssociateしていないから駄目ですって怒られてアプリが落ちるようになった。Views added to a FragmentContainerView must be associated with a Fragment. View *** is not associated with a Fragment.とか言って。
View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) のcontainerにaddView()しようとしただけなのだが。
仕方ないからFragmentのレイアウトXMLにカスタムViewを追加する形にした。この時、いつの間にかViewを継承したときのコントラクタは、View(Context)ではなくView(Context, AttributeSet)でないとだめになっていた[12]

Reference#

  1. [#1]http://shokai.org/blog/archives/5401
  2. [#2]Google, 2018, AsyncTask, https://developer.android.com/reference/android/os/AsyncTask
  3. [#3]moshimore(モシモア), 2016年11月4日, Android StudioでAssetsフォルダを簡単に作成する方法, https://knowledge.moshimore.jp/entry/android_assets_folder
  4. [#4]株式会社GIG, 2021年7月アクセス, スプラッシュスクリーンでアプリ起動を劇的に!コードスニペット&事例19選, https://goworkship.com/magazine/splash-screen-design/
  5. [#5]@Futo_Horio, 2019年03月10日, 【 Android アプリ開発 】全画面表示を行う方法 ( 通知バー非表示 ), https://qiita.com/Futo_Horio/items/7bf65c4158bec6f30ffb
  6. [#6]K.I, Androidのファイルアクセス, https://bluefish.orz.hm/sdoc/android_file.html
  7. [#7]https://developer.android.com/guide/topics/providers/content-provider-basics?hl=JA
  8. [#8]Android ファイル読み込み(res/rawフォルダ、assetsフォルダ), http://yan-note.blogspot.com/2010/09/android-resrawassets.html
  9. [#9]ナビゲーション, https://developer.android.com/guide/navigation?hl=ja
  10. [#10]Stackoverflow, 2018年6月4日, How I can retrieve current fragment in NavHostFragment?, https://stackoverflow.com/questions/50689206/how-i-can-retrieve-current-fragment-in-navhostfragment
  11. [#11]@couzie, 2016年10月16日, App Bar, Status Bar, FAB, Navigation Drawer の色を変更する, https://qiita.com/couzie/items/b00764b694ca299d93cb
  12. [#12]ビュークラスを作成する, https://developer.android.com/training/custom-views/create-view?hl=ja#java
  13. [#13]起動時のActivityを変更する, https://qiita.com/okhiroyuki/items/8410433493c83ff6b4ca
  14. [#14]How to usesetVideoURImethodin android.widget.VideoView, https://www.codota.com/code/java/methods/android.widget.VideoView/setVideoURI