rokkonet

PC・Androidソフトウェア・アプリの開発・使い方に関するメモ

android開発 Bundleを利用したデータの受け渡し

2022 Feb. 26.
2021 Nov. 14.
2021 Oct. 31.

出典
onSaveInstanceStateについてちゃんと知る - Qiita

Bundleの保存・読み込み

onSaveInstanceStateはonPauseの直後に呼ばれる。
onSavedInstanceStateで保存した値は、onCreateもしくはonRestoreInstanceStateで復元が可能。
onRestoreInstanceStateはonStartの直後に呼ばれるが、常に呼ばれるわけではなく、保存後にActivityが破棄された次のライフサイクルのタイミングでのみ呼ばれる。

画面回転対応

onSaveInstanceStateでデータをBundleに保存する。
onRestoreInstanceStateでBundleからデータを読み込む。

sample kotlin code

    // 画面表示情報保存
    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        val textView1Str = binding.textView1.text.toString()
        outState.putString("textView1key", textView1Str)
    }

    // 画面表示情報再表示
    override fun onRestoreInstanceState(savedInstanceState: Bundle) {
        super.onRestoreInstanceState(savedInstanceState)
        binding.textView1.text = savedInstanceState.getString("textView1key", "")

    }


MainActivityとダイアログとの間のBundleを利用したデータ受け渡し

MainActivityで、Bundleを利用して、開こうとするダイアログにデータを渡すkotlinコード例
val str01 = "ab"
val int01 = 12
val args = Bundle()
args.putString("String01", smbDomain)
args.putInt("Integer01", int01)
val myDialogFragment = MyDialogFragment()
myDialogFragment.setArguments(args)
myDialogFragment.show(supportFragmentManager, "my")


ダイアログで、開く時にBundleからデータを取り出すkotlinコード例
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    val editTextStr01 = myDialogView.findViewById<EditText>(R.id.editTextStr01)
    val editTextInt01 = myDialogView.findViewById<EditText>(R.id.editTextInt01)
    editTextStr01.setText(requireArguments().getString("String01", ""))
    editTextInt01.setText(requireArguments().getInt("Integer01", 0).toString())
}

android開発 アプリケーションの再起動

2021 Oct. 31.

出典 Restarting Android app programmatically - Stack Overflow

val launchIntent = baseContext.packageManager
        .getLaunchIntentForPackage(baseContext.packageName)
launchIntent!!.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
finish()
startActivity(launchIntent)

arch系 manjaro linux chromeの更新

2021 Oct. 31.

参考ページ https://furuya7.hatenablog.com/entry/2020/05/06/180426

AUR Helperを使わずにAURからインストールしたchromeをyayで更新した。

$ yay -Syu

[sudo] USER のパスワード:
:: パッケージデータベースの同期中...
 core                  170.3 KiB  82.0 KiB/s 00:02 [######################] 100%
 extra は最新です
 community               6.8 MiB  2.43 MiB/s 00:03 [######################] 100%
 multilib は最新です
:: システム全体の更新を開始...
警告: manjaro-hello: ローカル (0.6.7-2) の方が extra よりも最新です (0.6.6-9)
 何も行うことがありません
:: データベースからアップデートを検索...
:: AUR からアップデートを検索...
 -> manjaro-hello: local (0.6.7-2) is newer than extra (0.6.6-9)
:: 1 アップグレードするパッケージ。
1  aur/google-chrome  91.0.4472.114-1 -> 95.0.4638.69-1
==> 除外するパッケージ: (例: "1 2 3", "1-3", "^4" またはリポジトリ名)
==> 
:: 衝突を確認...
:: 内部衝突を確認...
[Repo:1]  ttf-liberation-2.1.5-1
[Aur:1]  google-chrome-95.0.4638.69-1

:: (1/1) Downloaded PKGBUILD: google-chrome
  1 google-chrome                            (インストール済み) (ビルドファイルが存在)
==> 差異を表示しますか?
==> [N]なし [A]全て [Ab]中止 [I]インストール済み [No]未インストール または (1 2 3, 1-3, ^4)
==> I
diff --git /home/USER/.cache/yay/google-chrome/PKGBUILD /home/USER/.cache/yay/google-chrome/PKGBUILD
new file mode 100644
index 0000000..64a802a
--- /dev/null
+++ /home/USER/.cache/yay/google-chrome/PKGBUILD
@@ -0,0 +1,72 @@
+# Maintainer: Knut Ahlers <knut at ahlers dot me>
+# Contributor: Det <nimetonmaili g-mail>
+# Contributors: t3ddy, Lex Rivera aka x-demon, ruario
+
+# Check for new Linux releases in: http://googlechromereleases.blogspot.com/search/label/Stable%20updates
+# or use: $ curl -s https://dl.google.com/linux/chrome/rpm/stable/x86_64/repodata/other.xml.gz | gzip -df | awk -F\" '/pkgid/{ sub(".*-","",$4); print $4": "$10 }'
+
+pkgname=google-chrome
+pkgver=95.0.4638.69
+pkgrel=1
+pkgdesc="The popular and trusted web browser by Google (Stable Channel)"
+arch=('x86_64')
+url="https://www.google.com/chrome"
+license=('custom:chrome')
+depends=(
+       'alsa-lib'
+       'gtk3'
+       'libcups'
+       'libxss'
+       'libxtst'
+       'nss'
+       'ttf-liberation'
+       'xdg-utils'
+)
+optdepends=(
+       'pipewire: WebRTC desktop sharing under Wayland'
+       'kdialog: for file dialogs in KDE'
+       'gnome-keyring: for storing passwords in GNOME keyring'
+       'kwallet: for storing passwords in KWallet'
+)
+options=('!emptydirs' '!strip')
+install=$pkgname.install
+_channel=stable
+source=("https://dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-${_channel}/google-chrome-${_channel}_${pkgver}-1_amd64.deb"
+       'eula_text.html'
+       "google-chrome-$_channel.sh")
+sha512sums=('f07d16ec0a41120c40064d030e9e5240ed740b9b24c50eaede7b9bfd9a9678821c0252b40bfcd57e933a708b08d761482c3be5b3006eee605c41f5dc9e21f456'
+            'a225555c06b7c32f9f2657004558e3f996c981481dbb0d3cd79b1d59fa3f05d591af88399422d3ab29d9446c103e98d567aeafe061d9550817ab6e7eb0498396'
+            '43519ec81d008c9f949ef52b98a718473913e888d99ff6598083e30cd1f07376b5e58a7639fd309ee19056c18eac58cbf6a31bec6bfd2509ebce9fa9d6919743')
+
+package() {
+       echo "  -> Extracting the data.tar.xz..."
+       bsdtar -xf data.tar.xz -C "$pkgdir/"
+
+       echo "  -> Moving stuff in place..."
+       # Launcher
+       install -m755 google-chrome-$_channel.sh "$pkgdir"/usr/bin/google-chrome-$_channel
+
+       # Icons
+       for i in 16x16 24x24 32x32 48x48 64x64 128x128 256x256; do
+               install -Dm644 "$pkgdir"/opt/google/chrome/product_logo_${i/x*/}.png \
+                       "$pkgdir"/usr/share/icons/hicolor/$i/apps/google-chrome.png

==> インストールを実行しますか? [Y/n] Y
:: (1/1) SRCINFO を解析中: google-chrome
[sudo] USER のパスワード:
:: パッケージデータベースの同期中...
 core は最新です
 extra は最新です
 community は最新です
 multilib は最新です
依存関係を解決しています...
衝突するパッケージがないか確認しています...

パッケージ (1) ttf-liberation-2.1.5-1

合計ダウンロード容量:  1.53 MiB
合計インストール容量:  4.16 MiB

:: インストールを行いますか? [Y/n]  (ここでYを入力した)
:: パッケージを取得します...
 ttf-liberation-2...  1566.4 KiB  5.88 MiB/s 00:00 [######################] 100%
(1/1) キーリングのキーを確認                       [######################] 100%
(1/1) パッケージの整合性をチェック                 [######################] 100%
(1/1) パッケージファイルのロード                   [######################] 100%
(1/1) ファイルの衝突をチェック                     [######################] 100%
(1/1) 空き容量を確認                               [######################] 100%
:: パッケージの変更を処理しています...
(1/1) インストール ttf-liberation                  [######################] 100%
:: トランザクション後のフックを実行...
(1/3) Arming ConditionNeedsUpdate...
(2/3) Updating fontconfig cache...
(3/3) Updating X fontdir indices...
==> パッケージを作成: google-chrome 95.0.4638.69-1 (20211031083217)
==> ソースを取得...
  -> ダウンロード google-chrome-stable_95.0.4638.69-1_amd64.deb...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 85.5M  100 85.5M    0     0  10.3M      0  0:00:08  0:00:08 --:--:-- 10.7M
  -> eula_text.html を見つけました
  -> google-chrome-stable.sh を見つけました
==> source で sha512sums ファイルを検証...
    google-chrome-stable_95.0.4638.69-1_amd64.deb ... 成功
    eula_text.html ... 成功
    google-chrome-stable.sh ... 成功
 -> ttf-liberation が満たされていません、インストールキューを消去
==> パッケージを作成: google-chrome 95.0.4638.69-1 (20211031083228)
==> ランタイムの依存関係を確認...
==> ビルドタイムの依存関係を確認...
==> ソースを取得...
  -> google-chrome-stable_95.0.4638.69-1_amd64.deb を見つけました
  -> eula_text.html を見つけました
  -> google-chrome-stable.sh を見つけました
==> source で sha512sums ファイルを検証...
    google-chrome-stable_95.0.4638.69-1_amd64.deb ... 成功
    eula_text.html ... 成功
    google-chrome-stable.sh ... 成功
==> 既存の $srcdir/ ディレクトリを削除...
==> ソースを展開...
  -> google-chrome-stable_95.0.4638.69-1_amd64.deb を bsdtar で展開
==> ソースの準備ができました。
==> パッケージを作成: google-chrome 95.0.4638.69-1 (20211031083236)
==> ランタイムの依存関係を確認...
==> ビルドタイムの依存関係を確認...
==> 警告: 既存の $srcdir/ ツリーを使用
==> fakeroot 環境を開始します...
==> package() を開始...
  -> Extracting the data.tar.xz...
  -> Moving stuff in place...
  -> Fixing Chrome desktop entry...
  -> Removing Debian Cron job, duplicate product logos and menu directory...
==> インストールを整理...
  -> 空のディレクトリを削除...
  -> libtool ファイルを削除...
  -> 不要なファイルを削除...
  -> スタティックライブラリファイルを削除しています...
  -> man と info ページを圧縮...
==> パッケージの問題をチェック...
==> パッケージを作成 "google-chrome"...
  -> .PKGINFO ファイルを生成...
  -> .BUILDINFO ファイルを生成...
  -> install ファイルを追加...
  -> .MTREE ファイルを生成...
  -> パッケージの圧縮...
==> fakeroot 環境を終了。
==> 作成完了: google-chrome 95.0.4638.69-1 (20211031083301)
==> 清掃...
パッケージをロード...
依存関係を解決しています...
衝突するパッケージがないか確認しています...

パッケージ (1) google-chrome-95.0.4638.69-1

合計インストール容量:        272.64 MiB
最終的なアップグレード容量:   18.62 MiB

:: インストールを行いますか? [Y/n]  (ここでYを入力した)
(1/1) キーリングのキーを確認                       [######################] 100%
(1/1) パッケージの整合性をチェック                 [######################] 100%
(1/1) パッケージファイルのロード                   [######################] 100%
(1/1) ファイルの衝突をチェック                     [######################] 100%
(1/1) 空き容量を確認                               [######################] 100%
:: パッケージの変更を処理しています...
(1/1) 更新 google-chrome                           [######################] 100%
==> NOTE: Custom flags should be put directly in: ~/.config/chrome-flags.conf
==> NOTE: The launcher is called: 'google-chrome-stable'
:: トランザクション後のフックを実行...
(1/3) Arming ConditionNeedsUpdate...
(2/3) Updating icon theme caches...
(3/3) Updating the desktop file MIME type cache...

arch系 manjaro linuxへのyayのインストール

2021 Nov. 25.
2021 Oct. 31.

出典 Arch Linux : AURヘルパー「yay」を試す | SlackNote

Manjaro Linux には初めからリポジトリに入っているので、そのままインストールすればよい。

AURヘルパーがない状態の Arch Linux だと以下の手順を踏む。

$ cd YOUR/WORK/DIR/
$ git clone https://aur.archlinux.org/yay.git
$ cd ./yay
$ makepkg -si


yayをrootユーザー権限で利用しないこと。

$ yay -Syu
$ yay -S PACKAGE

android開発 AlertDialogのボタンオブジェクトの取得

2021 Oct. 30.

出典 Android - android開発 DialogFragmentのonStart()内でのOKボタンのOnClickイベント捕捉|teratail

概要

DialogFragmentのonCreateDialog()内でのAlertDialog.Builderのcreate()時に、「ボタンオブジェクトを取得し、操作する」ハンドラをAlertDialogのOnShowイベントにセットする。

出典ページからのコード

class MyDialogFragment: DialogFragment() {
    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        return activity?.let {
            val view = requireActivity().layoutInflater.inflate(R.layout.my_dialog, null)
            val builder = AlertDialog.Builder(it).setView(view)
                .setPositiveButton(android.R.string.ok, { dialog, id -> })
                .setNegativeButton(android.R.string.cancel, { dialog, id ->
                    dialog.cancel()
                })

            builder.create().also { dialog ->  // dialogを返すと共にdialogにOnShowListenerをセットする
                dialog.setOnShowListener({
                    val button = dialog.getButton(Dialog.BUTTON_POSITIVE)
                    CODES TO BUTTON
                })
            }
        } ?: throw IllegalStateException("Activity cannot be null")
    }
}

android開発 ダイアログ上の2つの EditText の両方に文字列がある時にOKボタンを有効にする

2021 Oct. 30.

出典 Android - android開発 DialogFragmentのonStart()内でのOKボタンのOnClickイベント捕捉|teratail

概要

TextWatcherでEditTextへの入力状況を監視し、条件を満たした時のみOKボタンを有効(isEnabled)にする。

TextWatcherのafterTextChanged()にOKボタン有効可否判定処理を定義する。
DialogFragmentのonCreateDialog()内でのAlertDialog.Builderのcreate()時に、「OKボタンを取得し、TextWatcherによってOKボタンをコントロールする」ハンドラをAlertDialogのOnShowイベントにセットする。

出典ページからのコード

class MyDialogFragment: DialogFragment() {
    // 2つの EditText に文字列があるか無いかで buttonの enable を制御する
    class EditsWatcher(val button: Button, val edit1: EditText, val edit2: EditText): TextWatcher {
        init {
            edit1.addTextChangedListener(this)
            edit2.addTextChangedListener(this)
            afterTextChanged(null)
        }
        override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} //ignore
        override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {} //ignore
        override fun afterTextChanged(s: Editable?) {
            button.isEnabled = edit1.text.toString().trim().isNotEmpty() && edit2.text.toString().trim().isNotEmpty();
        }
    }

    // ダイアログ表示
    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        return activity?.let {
            val view = requireActivity().layoutInflater.inflate(R.layout.my_dialog, null)
            val edData1 = view.findViewById<EditText>(R.id.etData1)  // EditText取得
            val edData2 = view.findViewById<EditText>(R.id.etData2) // EditText取得

            val builder = AlertDialog.Builder(it).setView(view)
                .setPositiveButton(android.R.string.ok, { dialog, id -> })
                .setNegativeButton(android.R.string.cancel, { dialog, id ->
                    dialog.cancel()
                })

            builder.create().also { dialog ->  // dialogを返すと共にdialogにOnShowListenerをセットする
                dialog.setOnShowListener({
                    val button = dialog.getButton(Dialog.BUTTON_POSITIVE)
                    EditsWatcher(button, edData1, edData2)
                })
            }
        } ?: throw IllegalStateException("Activity cannot be null")
}


android開発 DialogFragmentのインスタンスはshowメソッドを実行するルーチン内のローカル変数とする

2021 Oct. 30.

DialogFragmentのインスタンスはshowメソッドを実行するルーチン内のローカル変数とする。
表示が終わると自動で削除されることがあるので、グローバルに保持すると、メモリリークとなる恐れがある。

ボタン(btnOpenDialog)をタップしたらダイアログ(myDialogFragment)を開く例
viewBinding.btnOpenDialog.setOnClickListener {
    val myDialogFragment = MyDialogFragment()
    myDialogFragment.show(supportFragmentManager, "my")
}

出典 Android - android開発 DialogFragmentのonStart()内でのOKボタンのOnClickイベント捕捉|teratail