2021年12月31日金曜日

Menuの文字に色を付ける

 AndroidでToolbarを使いMenu表示させると、

以下のように文字が見えず空欄のMenuが表示されてしまう。



これはMenuの文字色が白、背景色も白であることが原因だった。

なのでMenuの文字色を調整する方法を記載する。

2021年11月14日日曜日

OutSystemsでTwitterのトレンドを取得する

OutSystemsでTwitterのトレンドを取得する方法をまとめておく。
トレンド取得APIの公式はここ

各ユーザ毎で行う方法と、アプリケーションとして行う方法の二種類あるが
今回はただトレンド情報を取得したいだけなので、ユーザ情報は使わず、
アプリケーションで行う方法をとる。

2021年10月26日火曜日

Firebaseのメールリンクでログインしてみる

 AndroidアプリでFirebaseを使ったメールリンク認証を作る際、
躓いたのでまとめておきます。


メールリンク認証とは

メールアドレスのみで認証する、パスワード設定が不要な認証方法です。

手順は
  1. アプリのユーザ登録画面からメールアドレスを入力してもらう
  2. Firebaseからそのメールアドレスに招待メールが送られる
  3. メールの招待RULをクリックすると、アプリが起動し認証完了(ユーザ登録完了)

メールを受け取れるということは本人である証明。というセキュリティの考え方。

2021年9月12日日曜日

ラズパイにPostgreSQLを入れてみる

 「OSS DB」という試験を受けようと思ったので、
公式で推していた「PostgreSQL」の環境構築をする。
環境はラズパイ3に作っていく。

2021年8月29日日曜日

「Redundant SAM - constructor」になった時の対処法

 Android開発をKotlin言語でしていると、ボタン押下などのリスナー設定をしているときに
「Redundant SAM - constructor」が出ることがあるので、意味と対処法を残しておく。
まぁ、
カーソルを合わせたときに出る「Remove redundant SAM - constructor」を押すか、Alt+Shift+Enterキーの同時押しをすれば、意味を理解していなくても自動でコードを修正してくれますけどね..


2021年8月22日日曜日

Activityの遷移時、すでに生成しているActivityへ遷移する方法

startActivityでActivityを切り替える場合、
デフォルトのままだと、毎回新規でActivityのインスタンスを作ってしまう。
なので、すでに同名Activityが存在していても、新しいActivityがスタック上にできあがる。


Intentで指定したActivityがすでに生成されている場合は、
生成済みActivityに遷移させるにはどうするか。について書いていく。

2021年8月11日水曜日

Ktolinで「Parameter 'xxx' is never used」というワーニングが出たときの対応

KtolinでAndroid開発をしているとき、 
ListViewなど押下イベント設定(setOnItemClickListener)をラムダで書くと以下のようになる。
// 押下したリストのアイテム情報をトースト表示する
listView.setOnItemClickListener { parent, view, position, id ->
    Toast.makeText(this, array[position], Toast.LENGTH_SHORT).show()
}
こうすると、
パラメータ4つあるけど positionしか使っておらず、残りの引数に波線が表示される。


ワーニングメッセージを見るとそれぞれ
Parameter 'parent' is never used, could be renamed to _
Parameter 'view' is never used, could be renamed to _
Parameter 'id' is never used, could be renamed to _

となっている。

2021年8月8日日曜日

AndroidStudioでビルドしようとするとエラーでできない

Android Studio Arctic Foxにアップデートして、
新しいプロジェクト立ち上げてビルドすると以下のエラーになった。

Build file 'E:\Document\MyApplication11\app\build.gradle' line: 2

An exception occurred applying plugin request [id: 'com.android.application']
> Failed to apply plugin 'com.android.internal.application'.
   > Android Gradle plugin requires Java 11 to run. You are currently using Java 1.8.
     You can try some of the following options:
       - changing the IDE settings.
       - changing the JAVA_HOME environment variable.
       - changing `org.gradle.java.home` in `gradle.properties`.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.


訳: 
Android Gradleプラグインを実行するには、Java11が必要です。
現在、Java1.8を使用しています。

つまり、
JDKのバージョンを11にすればよいということだ。

2021年6月15日火曜日

jcenter()が非推奨の為、AndroidStudioで新規作成するとエラー

AndroidStudioで新規プロジェクトを作成すると、以下のエラーが出てビルドできなくなったので備忘録
Please remove usages of `jcenter()` Maven repository from your build scripts and migrate your build to other Maven repositories.
This repository is deprecated and it will be shut down in the future.
See http://developer.android.com/r/tools/jcenter-end-of-service for more information.
Currently detected usages in: root project 'My Application', project ':app'
Affected Modules: app

どうやら「jcenter()が非推奨になって、じきに完全消滅するから、ビルドスクリプトから消してくれ」とのこと

AndroidStudio4.2でKotlinで新規プロジェクト作成するとエラーになる

以前にも紹介したが、また同類のエラーが発生したので備忘録
新規プロジェクトをKotlinで作成すると、以下のエラーが出てビルドできなくなった。
A problem occurred configuring root project 'My Application'.
> Could not resolve all artifacts for configuration ':classpath'.
   > Could not find org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.10-release-894.
     Searched in the following locations:
       - https://dl.google.com/dl/android/maven2/org/jetbrains/kotlin/kotlin-gradle-plugin/1.5.10-release-894/kotlin-gradle-plugin-1.5.10-release-894.pom
       - https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-gradle-plugin/1.5.10-release-894/kotlin-gradle-plugin-1.5.10-release-894.pom
     Required by:
         project :

Possible solution:
 - Declare repository providing the artifact, see the documentation at https://docs.gradle.org/current/userguide/declaring_repositories.html

どうやらkotlinのプラグイン「1.5.10-release-894」が見つからないらしい。。

2021年6月9日水曜日

KotlinでListの参照は[]を使うべきかgetを使うべきか

KotlinでListの参照を行うには以下二種類の方法が存在する
  • []のインデックス演算子で指定する方法
  • get()のメソッドで指定する方法

どちらを使うのが適切なのか調べてみると
言語仕様で[]を使う参照は、getに置き換えてくれてるようだ。

わざわざ[]で参照をできるように言語仕様側で調整していることになる。
ということは
言語開発者の意図として、[]を使ってほしいということ。

以上から、

Kotlin言語では[]で参照することが正しい

2021年5月11日火曜日

AndroidStudio4.2でKotlinが使えなくなった件

 AndroidStudio4.2がリリースされたのでアップデートしてみたら

新規プロジェクトをKotlinで作成すると、以下のエラーが出てビルドできなくなった。

A problem occurred configuring root project 'My Application'.
> Could not resolve all artifacts for configuration ':classpath'.
   > Could not find org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.0-release-764.
     Searched in the following locations:
       - https://dl.google.com/dl/android/maven2/org/jetbrains/kotlin/kotlin-gradle-plugin/1.5.0-release-764/kotlin-gradle-plugin-1.5.0-release-764.pom
       - https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-gradle-plugin/1.5.0-release-764/kotlin-gradle-plugin-1.5.0-release-764.pom
     Required by:
         project :

Possible solution:
 - Declare repository providing the artifact, see the documentation at https://docs.gradle.org/current/userguide/declaring_repositories.html

どうやらkotlinのプラグイン「1.5.0-release-764」が見つからないらしい。。

2021年4月11日日曜日

DialogFragmentは別ファイルに分けないとクラッシュする

前回、Fragmentはpublicクラスで定義しないと落ちる話をした。
当然、DialogFragmentもFragmentを継承しているので、この制約を受ける。。
よって、ファイルを分けてpublicクラスでDialogFragmentも定義しなくてはクラッシュすることになる。

しかし、ダイアログなんかは軽く表示させたいし、
わざわざクラスファイルを分けて記述していくのが面倒くさい。。
なので、ファイルを分けなくてすむ方法について記載する。

FragmentはPublic以外でクラス定義すると落ちる

Fragmentをpublic以外のアクセス修飾子でクラス定義していると、FragmentManagerに追加する際、以下のIllegalStateExceptionが投げられクラッシュする。

Caused by: java.lang.IllegalStateException: Fragment com.sample.test.myapplication.MainActivity.MyDialogFragment must be a public static class to be  properly recreated from instance state.
   at androidx.fragment.app.FragmentTransaction.doAddOp(FragmentTransaction.java:165)
   at androidx.fragment.app.BackStackRecord.doAddOp(BackStackRecord.java:179)
   at androidx.fragment.app.FragmentTransaction.add(FragmentTransaction.java:125)
   at androidx.fragment.app.DialogFragment.show(DialogFragment.java:154)
   at com.sample.test.myapplication.MainActivity.onClick(MainActivity.java:32)
このエラーが出たときの対処法は、
Fragmentを別のファイルに定義し、publicクラスにすればよい。
本記事では、何故このような制約があるのかについて書いていく。

2021年4月10日土曜日

Buttonの上にViewを載せる

AndroidアプリでButtonの上にViewやFragmentを乗せても、

Buttonが表示物に隠れず、ボタンが上に重なって表示される。

解決方法として、ボタンの属性「stateListAnimator」に「"@null"」を設定すれば良い。

例えば、ボタンの上に画像(ImageView)を配置したいときは以下のようにする。

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:stateListAnimator="@null" ★ コレ! ★
        />
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher_background"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        />

</androidx.constraintlayout.widget.ConstraintLayout>

2021年4月1日木曜日

GitHubで公開されているプロジェクトの取り込み

 Androidは公式がGitHubにサンプルプロジェクトを公開している。

これらのサンプルコードを取り込んでビルドしたいときの方法を残しておく。

※GitHubからソースコードを落としたいだけなら、手順2までで良い

2021年3月25日木曜日

ListViewに1件ずつ追加する方法

Androidでのリスト表示はListViewを使用することが多い。
何かを契機に1件ずつレコードを追加していく際によく以下のことが起こる
  • Listには追加できているのに見栄えに反映されない
  • 更新すると表示位置が先頭行に戻ってしまう
なので、
ボタンを押下を契機に一件ずつ要素を追加していき、
表示位置も維持するコードのサンプルを載せておく

2021年3月13日土曜日

SharedPreferences#StringSetの挙動について

 SharedPreferencesでStringSetを用いて追加保存する際、以下が起こることがある
  • 1件しか保存されない
  • 保存してないのに勝手にデータが保存されている

結論を先に書くと、
SharedPreferencesからgetStringSetする際、シャローコピーすれば解決するが
 // java版
 Set<String> set = new HashSet<>(
   getSharedPreferences("set",MODE_PRIVATE).getStringSet("data", new HashSet<>()));

 // Kotlin版
 val set = getSharedPreferences("set", MODE_PRIVATE)
   .getStringSet("data", mutableSetOf())?.toMutableSet()
どういう理屈なのかをもう少し詳しくまとめる。



2021年3月11日木曜日

Yahoo!知恵袋の添付画像を拡大する方法

Yahoo!知恵袋に添付されている画像について
スマホのアプリで見てるときはピンチ操作で拡大できるが、
パソコンで見ているときは拡大できない問題がある。
最近は質問文の画像は拡大できるようになったが、リプライに添付されている画像は小さいまま...

なので、
拡大して表示する方法を残しておく。

※この記事の方法は使えなくなったので、こっち参照

2021年3月7日日曜日

AndroidでkHttpを使ってみる

 Androidのネットワーク通信で有名な外部ライブラリといえば「OkHttp」「Retrofit」だろう。
なのであえて、「kHttp」というライブラリを使った通信を行ってみた。


kHttpとは

公式はここ
Pythonでスクレイピングをするときに使う「requestsモジュール」をKotlinで使うようにしたもの。Android以外でも使えるHTTPリクエストできるシンプルなライブラリだ。

2021年3月4日木曜日

findViewByIdとrequireViewByIdの違い

Androidでレイアウトファイルに定義したViewのインスタンスを探すのに
findViewByIdを使ったことある人は多いと思う。
ViewのAPI仕様を見てたら、requireViewByIdという似たようなメソッドを発見したので、違いを書き残しておく。

2021年2月28日日曜日

Xml declaration should precede all document contentのエラーになった時の対応

 Androidのレイアウトのcodeを書くとき、
「Xml declaration should precede all document content」というエラーになった
当然このまま実行してもAAPTでビルド失敗
MyApplication\app\src\main\res\layout\activity_main.xml:1: AAPT: error: XML or text declaration not at start of entity.
なので対応方法を書く。

2021年2月26日金曜日

ラジオボタンで選択中の文言を取得する

Androidでラジオボタンを使う際
選択中のラジオボタンの情報がほしくなることがある。
方法として
  • 公式通り、各ラジオボタンのクリック処理を実装し、 押されたタイミングで情報をローカル変数に保持しておく
  • 各ラジオボタンにisChecked()を実行していき、チェックONのラジオボタンを探す
  • RadioGroupのOnCheckedChangeListenerで変化を監視
どれもローカル変数を用意したり、全Viewチェックしたりで効率的でない。
今回はRadioGroupのAPI仕様を見てたら、丁度良さそうなのがあったので紹介。


Androidのラジオボタンを横並びにする

Androidアプリ開発でRadioButtonを使用する際
選択を変更したとき、他のチェック項目を自動で外す動作をさせるには
RadioButton達をRadioGroupにまとめておく必要がある。

しかし、RadioGroupに入れるとRadioButtonの配置が縦並びになってしまうので
横並びにする方法を記載する。

2021年2月23日火曜日

AndroidでLatex(数式)を扱う方法

 Androidの標準機能では数式を扱うことはできないので、外部ライブラリを探してみた。
Latexで数式が書けるライブラリを発見したので、使い方まとめ

2021年2月21日日曜日

SharedPreferencesで日時保存と取り出し方

Android開発で、SharedPreferencesを用いて日時を保存して、
取り出す際に日付型で取得する方法のまとめ。

日付を扱うクラスはDate、Calendar、LocalDate、LocalDateTime、LocalTimeがよくあるかな
と思うのでこの辺をまとめてみます。

2021年2月18日木曜日

app/build.gradleのプラグインの構文が変わっていた

Kotlin Android Extensionsを入れようとしたら、
app/build.gradleのプラグインの構文が変わっていたので備忘録


■ 以前(2020/12/04に作ってたプロジェクトはこっちだった)
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions' // 追加プラグイン


■ 今(2020/12/13以降に作ってたプロジェクトはこっちだった)
plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-android-extensions' // 追加プラグイン
}

2021年2月17日水曜日

SharedPreferencesでのcommitとapplyの違い

Androidアプリ開発での簡単なデータ保存で用いるSharedPreferences
データ保存する際に、「commit」と「apply」の二種類存在していて、どちらを使えばいいのか検討したく、違いについて調べてみた。

2021年2月16日火曜日

Viewの表示非表示状態を保存する

AndroidでTextViewなどのViewの表示切替を行った後、次回のアプリ起動でそのView表示可否状態を維持したいときの保存はSharedPreferencesが便利です。


2021年2月14日日曜日

パーミッション設定せずに外部ストレージ保存する方法

Androidスマホでデータを取って、PCと接続して抜き出す。
これを繰り返すような作業をするとき、端末内にファイル書き込みする手が有力だ。

その際に直面するのが、どこにファイル保存するか。
内部ストレージになら簡単に保存できるが、PCへファイルの抜き出しが面倒...
逆に外部ストレージに保存するなら、Androidのシステム上、Manifestへパーミッション設定、動的にラインタイムパーミッションの実装が必要で面倒...しかも外部ストレージアクセス法がOSバージョンによって異なるのも厄介。

なので、今回は
パーミッション設定せずに外部ストレージ保存する方法を書き残しておく。


2021年2月6日土曜日

ViewのVisibility(表示)の違い

AndroidのViewの表示状態(Visibility)は「VISIBLE, INVISIBLE, GONE」の三種類ある。
VISIBLEはわかりやすいが、INVISIBLE, GONEは共に非表示を意味し、その違いがわかりにくいのでまとめておく。


Android11にUpdateしたらUSBデバッグできなくなった

OSをAndroid11にUpdateしたら、PCと端末をSUB接続してもPCが端末を認識しなくなった。
コマンドプロンプトを起動させて、「adb shell」を打つと以下のエラー
>adb shell
error: device unauthorized.
This adb server's $ADB_VENDOR_KEYS is not set
Try 'adb kill-server' if that seems wrong.
Otherwise check for a confirmation dialog on your device.

2021年1月31日日曜日

AdvancedApkToolで再ビルドに失敗するときの対応

 APKファイルの逆コンパイル(Decompile Files)には成功し、「3-Out」フォルダに各ファイルができているのに、再コンパイル(Recompile Files)すると、「4-Done」フォルダにAPKファイルができず失敗していた。

なので、原因を調べてみた。

2021年1月30日土曜日

Android端末の操作をgif動画にする

スマホアプリの動作をブログに張るのにgifファイルが便利だったので、

スマホ操作をGifにする方法を残しておく。

mp4をgifに変換するだけなら手順7のサイトで変換するだけでよい


CompactCalendarViewで日付を取得する

Androidの開発でカレンダーを使うとなると、CalendarViewかCompactCalendarView。ダイアログ表示も含めるならDatePickerDialogもありますね。
今回はあまり使う機会のないCompactCalendarViewの日付取得方法を残しときます。

2021年1月27日水曜日

Yahoo!知恵袋にソースコードを張る(共有する)方法

Yahoo!知恵袋にソースコードを張ると、
インデントがなくなり、行番号もわからず、文字に色もつかないので非常に見にくい。
また、文字数制限もあり、全部コードを1回で張れない。
以上から、ソースコードを共有できるサイトにコピペし、そのRULを知恵袋に貼る方法が楽だと思う。
アカウントを作らず手軽にソースコードを張れるサイトを紹介する。


2021年1月25日月曜日

Androidでパズドラ風な操作を実装する

Androidでパズドラ風のドラッグ操作を作る機会があったのでjavaでのソースコードを残しておく
Kotlinも書こうかと思ったけど、コピペしてAndroidStudioに貼ったら自動変換されるので良しとする
こういう動き


2021年1月17日日曜日

ブログにコードを張る方法(Google-code-prettify)

以前、「SyntaxHighlighter」というツールでブログにソースを張る方法を展開していたが、 いつの間にか使えなくなっていた。
なので
新たにファイルのダウンロード不要で、 記事内に書いたコードをかっこよく見せる方法について調べてみた。