diadia

興味があることをやってみる。自分のメモを残しておきます。

RecyclerView 各要素をタップして画面遷移させる

実装概要

  1. RecyclerViewを実装する。
  2. View.OnClickListenerでタップ時の画面遷移ロジックを記述する。ここについてはcontextの記述の仕方を学んだ。
  3. 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

  1. 結合するレイアウトファイルを作成する
  2. 結合先のレイアウトファイルに結合するファイルの内容を記述する

結合するレイアウトファイル(子)を作成する

レイアウトファイルを新たに作成する場合には、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 について

https://docs.djangoproject.com/en/3.0/ref/files/storage/#django.core.files.storage.Storage.get_available_name

 

mediaファイルをdjangoのwebアプリケーションを通さないで、jquery等で直接サーバーに送信する。その後シグナル等でmediaファイルとオブジェクトをmediaファイルパスで結びつける。使えそう

 

nginxが画像アップロードする際に単一のファイル名でアップロードすることってできないのか?

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();

Ping の使い方をちょっと調べる

さくらVPSを海外で使うと遅い問題

他のVPSを採用することを選択肢に入れている。ただどれだけ速度が変わるのかはわからないので速度について調べたいと思う。それにはどうもPingが使えるようだ。

Pingの仕組みは接続したいホストにパケットを発行して送信し、戻ってくるかを確認している。

結果として表示されるtime=41.498 msは、パケットをホストに送信して返事が戻ってきたまでの時間を示す。

javaのthisについて

kotlinのthisがわからないのでthisを調べたけど、説明がなかったのでjavaの資料からthisについて調べてみる。
呼び出されたコンストラクタやメソッドのオブジェクトを参照するために使われる予約語のことらしい。pythonでいうクラスのselfがthisに当たるのかもしれない。

https://teratail.com/questions/130636

kotlin サイドメニューの実装について

資料

NavigationDrawerActivityを使うと良いみたいだ。NavigationDrawerActivityはプロジェクトテンプレートのひとつで、普段はEmptyActivityを選んでいる。そしてレイアウトファイル(.xml)ではNavigationViewを使うようだ。

javaではActionBarDrawerToggleを使ってサイドメニューを実装するようだ。

ScrollViewの使い方

意義

TextViewに画面以上のテキストを表示させると、すべてのテキストを表示できないが、スクロールして残りのテキストを表示することもできない。スクロールできるようにするためにScrollViewが使われる。

ScrollView使用の注意点

ScrollViw以下の子Viewは1つのみ受け入れる仕組みになっている。2つ子Viewを配置するとエラーが起きてしまうので注意すること。