RecyclerView 各要素をタップして画面遷移させる
実装概要
- RecyclerViewを実装する。
- View.OnClickListenerでタップ時の画面遷移ロジックを記述する。ここについてはcontextの記述の仕方を学んだ。
- onCreateViewHolderメソッドのオーバーライドの内容にリスナーを記述する。
RecyclerViewの実装
親レイアウト、子レイアウト、Activity(.ktファイル)を記述する。
Activity(.ktファイル)では、onCreateメソッドでrecyclerviewのインフレイトの実行を行う。RecyclerView.Adapterメソッドを継承したクラス内で、onCreateviewHolderメソッドをオーバーライドする。
onBindViewHolderで各ViewHolderインスタンスの各属性にテキスト等を設定する。具体的には以下を見る。
http://torajirousan.hatenadiary.jp/entry/2020/01/18/234932
View.onClickListenerクラスの継承でリスナーを生成する
リスナーは以下のように記述する。
private inner class ItemClickListener : View.OnClickListener{ override fun onClick(view : View){ // 詳細ページを遷移させるロジックを記述する var context = view.context context.startActivity(Intent(context, DetailActivity::class.java)) } }
RecyclerViewの各要素をタップして画面遷移させる方法については悩んだが以下を参考にして上記のコードを記述するに至った。
参考:
https://www.raywenderlich.com/1560485-android-recyclerview-tutorial-with-kotlin
val context = itemView.context val showPhotoIntent = Intent(context, PhotoActivity::class.java) showPhotoIntent.putExtra(PHOTO_KEY, photo) context.startActivity(showPhotoIntent)
onCreateViewHolderメソッドのオーバーライドの内容にリスナーを記述する
return viewholderインスタンスの前にリスナーをセットすれば良い。
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyAdapter.MyViewHolder { // create a new view val rowView = LayoutInflater.from(parent.context) .inflate(R.layout.list_item, parent, false) //以下のようにリスナーを設定する rowView.setOnClickListener(ItemClickListener()) return MyViewHolder(rowView) }
RecyclerView 枠線を追加する
RecyclerView
RecyclerViewを実装しただけでは枠線は表示されない。表示させるように実装する必要がある。
参考
https://developer.android.com/reference/kotlin/androidx/recyclerview/widget/DividerItemDecoration
https://note.com/teamsom/n/n25fcc1c352c7
https://qiita.com/morimonn/items/035b1d85fec56e64f3e1
使い方
使い方のイメージはrecyclerviewをfindViewByIdメソッドで取得し、apply{}内に枠線を表示する旨の要素(addItemDecoration()メソッド)を記述する。addItemDecorationメソッドの引数として、DividerItemDecorationクラスインスタンスが必要になる。
val divider = androidx.recyclerview.widget.DividerItemDecoration(my_recycler_view.context,LinearLayoutManager(this).orientation) ... val resyclerview = findViewById<RecyclerView>(R.id.my_recycler_view).apply{ ... ... addItemDecoration(divider) }
DividerItemDecorationインスタンスの生成方法にはその他として以下がある
val divider = androidx.recyclerview.widget.DividerItemDecoration(this, androidx.recyclerview.widget.DividerItemDecoration.VERTICAL)
android:contentDescriptionについて
https://support.google.com/accessibility/android/answer/7158690?hl=ja
https://akira-watson.com/android/imageview.html
https://qiita.com/Horie1024/items/7806034a366d776c9b71
android:contentDescriptionはImageViewやImageButton,CheckBoxなどで使われる属性である。
画像のラベルの役割を果たす。これを設定しないと警告が出るようだ。しかしながらアプリケーションとしては動くのでそんなに気にする必要もないようだ。
kotlin android layoutinflateについて調べる
レイアウトファイルを動的に(pragramaticaly)結合する
参考:
(java)https://zawapro.com/?p=138
(java)https://akira-watson.com/android/inflate.html
(kotlin) https://ithelp.ithome.com.tw/articles/10203735
方法
- Adapterを使う
- LayoutInflaterを使う
リストビューにレイアウトファイルを追加する方法としては、adapterを用いる。例えばSimpleAdapterを用いれば以下のようにすることができる。
val adapter = SimpleAdapter(applicationContext, item_list, R.layout.item_row, FROM, TO) // R.layout.item_rowは自作した別のレイアウトファイル
リストビューにアダプタを使うことでAdapterクラスインスタンス生成時に作成したレイアウトファイルをリストビューにくっつけることで、結果的にレイアウトファイル同士を結合させている。
その他の結合方法としてレイアウトインフレイトがある。LayoutInflaterについては明確な説明がある。
用來將 res/layout/ 下的 xml 佈局文件加載成 View
訳は”res / layout /の下のxmlレイアウトファイルをViewにロードするために使用されます。”である。
LayoutInflaterを使えば動的にレイアウトxmlからViewを生成できる。LayoutInflaterはActivityのgetLayoutInflater()メソッドを使うとlayoutInflaterを取得できる。その他LayoutInflaterを取得する方法はいくつかある。
layoutinflaterを取得する方法
- LayoutInflater.from(context)
val inflater = LayoutInflater.from(context)
- getLayoutInflater()
val inflater = getLayoutInflater()
- Context.getSystemService(serviceClass: Class<T>
val inflater = getSystemService(LayoutInflater::class.java) as LayoutInflater
- Context.getSystemService(name: String )
val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
Viewにレイアウトファイルを読み込む方法
inflate (resource: Int, root: ViewGroup, attachToRoot: Boolean)
val view = inflater.inflate(R.layout.image, viewGroup, fasle)
kotlin android レイアウトファイルを結合する方法について
レイアウトファイルを結合するとは
レイアウトファイルに他のレイアウトファイルを合体させて一つのレイアウトファイルとして機能させることをいう。
レイアウトファイルを結合する目的
レイアウトファイルはres/layout以下にファイルを作成する。一つのレイアウトファイルにたくさん書くと可読性が落ちるため、スッキリさせるためにレイアウトファイルを結合する。レイアウトファイルに同じ内容を何度も書く場合に重複して書くことを避けるために結合をする。
結合する手続き
参考:
https://qiita.com/sussan0416/items/531b77be1676a30b8fab
- 結合するレイアウトファイルを作成する
- 結合先のレイアウトファイルに結合するファイルの内容を記述する
結合するレイアウトファイル(子)を作成する
レイアウトファイルを新たに作成する場合には、res/layoutディレクトリ上で右クリックをする。Newを選択し、続いてLayout Layout resource fileを選択する。すると作成するレイアウトファイルのファイル名等を決めることになる。これらの手続きを終わらせるとレイアウトファイルが作成されるので、View等を記述すれば良い。
結合先のレイアウトファイル(親)に結合するファイルの内容を記述する
結合先のレイアウトファイルにはタグとしてincludeを使うことと、結合させるレイアウトファイルの指定を行う。
<include layout="@layout/item_card_content" android:id="@+id/inclued_card"/> <!-- @layout以下はレイアウトファイル名を記述する -->
結合したレイアウトファイルの要素をアクティビティで取得する方法
findViewByIdを2回使えば結合したレイアウトファイルのViewを取得する事ができる。
//例 val inclued_view = findViewById<LinearLayout>(R.id.oya_layout).findViewById<TextView>(R.id.ko_layout)
疑問:結合するレイアウトをActivityで使用することができるのか
django file storage について
nginx
どうやらnginxだけで画像から画像サムネイルの作成(画像のリサイズ)を実施して配信ができるようだ。
ngx_http_image_filter_moduleがそれである。p.178
nginxの設定ファイルは以下で確認できる
nginx -V
django の画像(Media)アップロードに時間がかかる場合の対処
データを保存する際に小さなサイズにするとよい。それにはPillowのresizeが有効。なぜならアスペクト比を壊さないで済むから。
参考:https://djangosnippets.org/snippets/10597/
https://www.pynote.info/entry/pillow-resize
geodjangoのためにcentos7でpostgis環境を構築する
まずCentos7にpostgresql11をインストールする
postgeSQL公式のリポジトリを利用する。
$ sudo yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
リポジトリをインストール後postgresqlをインストールする。今回はpostgresql11を利用する。
postgresql11-serverのインストールで依存するパッケージもインストールされる。
# yum install postgresql11-server ( 補足 )yum install postgreql-serverにするとcentos7備え付けのpostgresqlをインストールすることになるので気をつけること
そうすると以下のような依存関係にあるものも一緒にインストールされる。
Installed: postgresql11-server.x86_64 0:11.3-1PGDG.rhel7 Dependency Installed: libicu.x86_64 0:50.1.2-17.el7 postgresql11.x86_64 0:11.3-1PGDG.rhel7 postgresql11-libs.x86_64 0:11.3-1PGDG.rhel7
postGISのライブラリをインストールする
参考:https://qiita.com/SOJO/items/216b6897104354a0c3fb
EPELのインストール
# yum install epel-release
Proj とGDALのインストール
# yum install -y proj proj-devel proj-epsg # yum --enablerepo=epel install gdal
PostGIS のインストールをおこなう。入手できる postgis のパッケージを確認する
# yum list | grep postgis postgis.x86_64 2.0.7-2.el7 epel postgis-docs.x86_64 2.0.7-2.el7 epel postgis-utils.x86_64 2.0.7-2.el7 epel postgis22_94.x86_64 2.2.7-1.rhel7 pgdg94 postgis22_94-client.x86_64 2.2.7-1.rhel7 pgdg94 postgis22_94-debuginfo.x86_64 2.2.6-1.rhel7 pgdg94 postgis22_94-devel.x86_64 2.2.7-1.rhel7 pgdg94 postgis22_94-docs.x86_64 2.2.7-1.rhel7 pgdg94 postgis22_94-utils.x86_64 2.2.7-1.rhel7 pgdg94 postgis22_95.x86_64 2.2.7-1.rhel7 pgdg95 postgis22_95-client.x86_64 2.2.7-1.rhel7 pgdg95 postgis22_95-debuginfo.x86_64 2.2.6-1.rhel7 pgdg95 postgis22_95-devel.x86_64 2.2.7-1.rhel7 pgdg95 postgis22_95-docs.x86_64 2.2.7-1.rhel7 pgdg95 postgis22_95-utils.x86_64 2.2.7-1.rhel7 pgdg95 ...割愛... postgis30_11.x86_64 3.0.0-1.rhel7 pgdg11 postgis30_11-client.x86_64 3.0.0-1.rhel7 pgdg11 postgis30_11-debuginfo.x86_64 3.0.0-1.rhel7 pgdg11 postgis30_11-devel.x86_64 3.0.0-1.rhel7 pgdg11 postgis30_11-docs.x86_64 3.0.0-1.rhel7 pgdg11 postgis30_11-gui.x86_64 3.0.0-1.rhel7 pgdg11 postgis30_11-utils.x86_64 3.0.0-1.rhel7 pgdg11 postgis30_12.x86_64 3.0.0-1.rhel7 pgdg12 postgis30_12-client.x86_64 3.0.0-1.rhel7 pgdg12 postgis30_12-debuginfo.x86_64 3.0.0-1.rhel7 pgdg12 postgis30_12-devel.x86_64 3.0.0-1.rhel7 pgdg12 postgis30_12-docs.x86_64 3.0.0-1.rhel7 pgdg12 postgis30_12-gui.x86_64 3.0.0-1.rhel7 pgdg12 postgis30_12-utils.x86_64 3.0.0-1.rhel7 pgdg12 postgis30_95.x86_64 3.0.0-1.rhel7 pgdg95 postgis30_95-client.x86_64 3.0.0-1.rhel7 pgdg95 postgis30_95-debuginfo.x86_64 3.0.0-1.rhel7 pgdg95 postgis30_95-devel.x86_64 3.0.0-1.rhel7 pgdg95 postgis30_95-docs.x86_64 3.0.0-1.rhel7 pgdg95 postgis30_95-gui.x86_64 3.0.0-1.rhel7 pgdg95 postgis30_95-utils.x86_64 3.0.0-1.rhel7 pgdg95 postgis30_96.x86_64 3.0.0-1.rhel7 pgdg96 postgis30_96-client.x86_64 3.0.0-1.rhel7 pgdg96 postgis30_96-debuginfo.x86_64 3.0.0-1.rhel7 pgdg96 postgis30_96-devel.x86_64 3.0.0-1.rhel7 pgdg96 postgis30_96-docs.x86_64 3.0.0-1.rhel7 pgdg96 postgis30_96-gui.x86_64 3.0.0-1.rhel7 pgdg96 postgis30_96-utils.x86_64 3.0.0-1.rhel7 pgdg96
postgis30_11 というのが PostgreSQL11 に対応したものである。これをインストールする。
yum install postgis30_11.x86_64
データクラスター($PGDATA)を作成する
データクラスターを作成するためにはPostgreSQLの初期化する。初期化すると自動的にデータクラスターを作成される。 参考:https://www.postgresql.jp/document/10/html/creating-cluster.html 初期化するにはinitdbコマンドを入力する必要がある。しかしながらinitdbへのパスが通っていないので以下のようにしてinitdbコマンドを入力する。
# initdbの実行 # /usr/pgsql-11/bin/postgresql-11-setup initdb Initializing database ... OK
インストールするとpostgresユーザが自動的に作成される。このpostgresユーザのパスワードを設定する。パスワードの設定はos(centos7)のユーザ切り替え用のパスワードの設定とpostgresqlに接続するためのパスワードの設定がある。
# osユーザ切り替えのためのパスワード設定 sudo passwd postgres Changing password for user postgres. New password: Retype new password: passwd: all authentication tokens updated successfully.
ちなみにpostgresql11の場合データベースクラスターは以下のパスに作成される。
/var/lib/pgsql/11/data
参考:https://qiita.com/zabutonzabuzabu/items/070a7f833bb321e46b0e
# su postgres psql -U postgres ALTER ROLE postgres WITH PASSWORD '設定したいpostgresのパスワード'; # データベースの作成 CREATE DATABASE [database名] ; # ユーザを作成する CREATE USER [ユーザ名] WITH PASSWORD '[パスワード]' ; ALTER ROLE [ユーザ名] SET client_encoding TO 'utf8' ; ALTER ROLE [ユーザ名] SET default_transaction_isolation TO 'read committed'; ALTER ROLE [ユーザ名] SET timezone TO 'Asia/Tokyo'; # このセット内容をデータベースに反映させるコマンドをが以下のもの。 GRANT ALL PRIVILEGES ON DATABASE [database名] TO [ユーザ名]; \q vi /var/lib/pgsql/11/data/pg_hba.conf #認証方法をpeerからmd5に変更 local all all md5
# systemctl start postgresql-11 # systemctl enable postgresql-11 su postgres psql -U postgres -d postgis_test; postgis_test=# CREATE EXTENSION postgis; CREATE EXTENSION postgis_test=# SELECT PostGIS_full_version();
javaのthisについて
kotlin サイドメニューの実装について
資料
- https://android.keicode.com/basics/ui-navigation-drawer-overview.php
- https://android.keicode.com/basics/ui-navigation-drawer.php
- https://qiita.com/yuto_aka_ike/items/ee7511bd2fee70b4ab49
NavigationDrawerActivityを使うと良いみたいだ。NavigationDrawerActivityはプロジェクトテンプレートのひとつで、普段はEmptyActivityを選んでいる。そしてレイアウトファイル(.xml)ではNavigationViewを使うようだ。
javaではActionBarDrawerToggleを使ってサイドメニューを実装するようだ。
ScrollViewの使い方
意義
TextViewに画面以上のテキストを表示させると、すべてのテキストを表示できないが、スクロールして残りのテキストを表示することもできない。スクロールできるようにするためにScrollViewが使われる。
ScrollView使用の注意点
ScrollViw以下の子Viewは1つのみ受け入れる仕組みになっている。2つ子Viewを配置するとエラーが起きてしまうので注意すること。