質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

2回答

3148閲覧

【Kotlin】onCreate()内で共有プリファレンスを初期化したい

Nmr_

総合スコア1

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2020/10/13 10:17

編集2020/10/13 10:29

前提・実現したいこと

「はじめてのAndroidプログラミング 第4版」を参考にAndroid Studioでじゃんけんアプリのコードを書いています。

共有プリファレンスを用いて前回の結果を保存しており、
メイン画面のonCreate()でプリファレンス内を初期化したいです。

発生している問題・エラーメッセージ

pref.edit{}内が赤い波線になり、 Too many arguments for public abstract fun edit(): SharedPreferences.Editor! defined in android.content.SharedPreferences と出ています。

該当のソースコード

Kotlin

1class MainActivity : AppCompatActivity() { 2 override fun onCreate(savedInstanceState: Bundle?) { 3 super.onCreate(savedInstanceState) 4 setContentView(R.layout.activity_main) 5 gu.setOnClickListener { onJankenButtonTapped(it) } 6 choki.setOnClickListener { onJankenButtonTapped(it) } 7 pa.setOnClickListener { onJankenButtonTapped(it) } 8 9 val pref = getSharedPreferences(packageName + "_preferences", MODE_PRIVATE) 10 pref.edit { 11 clear() 12 } 13 14 }

試したこと

元のコードでは

val pref = PreferenceManegar.getDefaultSharedPreferences(this)

でしたが、共有プリファレンスが非推奨コードになっているとのことだったので
デベロッパーを参考に下記に書き換えましたが、どちらも同じエラーになりました。

val pref = getSharedPreferences(packageName + "_preferences", MODE_PRIVATE)

補足情報(FW/ツールのバージョンなど)

Android Studio 4.0.1
他不足情報があれば追記します。
ご教授のほどよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

ベストアンサー後なのですが、edit {}のような記法はAndroid KTXの拡張機能であり、SharedPreferences#edit()とは別関数です。

Android KTX | Android Developers
androidx.core.content#edit | Android Developers

この関数を利用するためには、まずbuild.gradle(:app)に以下の記述を追加します。

gradle

1android { 2 (中略) 3 4 kotlinOptions { 5 jvmTarget = "1.8" 6 } 7}

kotlinソースファイルの方には次のimport文を追加します。

kotlin

1import androidx.core.content.edit 2

androidx.core.content.editの関数内にapply()(引数によってcommit()を選択することも可)が実装されているため、ユーザーが記述するソースでは改めてapply()commit()を記述する必要はありません。


共有プリファレンスが非推奨コードになっているとのことだったので

これについても、AndroidXライブラリーによるPreferenceManagerの利用が推奨されるようになったことによるものです。build.gradle(:app)のdependenciesブロックに

gradle

1 implementation 'androidx.preference:preference:1.1.1'

を追加し、kotlinソースファイルでは

kotlin

1import androidx.preference.PreferenceManager

のようにandroidxに改めることによって、非推奨を表す取り消し線を消すことができるでしょう。(ちなみに質問に記述されたPreferenceManegarは誤スペルですね)

投稿2020/10/13 16:25

編集2020/10/14 05:33
keicha_hrs

総合スコア6768

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2020/10/13 22:11

keicha_hrsさん、どうもありがとうございます。質問者さんの質問中、「試したこと」で > 共有プリファレンスが非推奨コードになっているとのことだったので > デベロッパーを参考に下記に書き換えましたが、 とあり、この話の流れでいくとedit {}の記法を用いたことによる問題の解決方法はkeicha_hrsさんの回答が適切ですね。BAはこちらへお譲りしたい気持ちです。Android開発環境/Kotlinに関する情報のキャッチアップの必要性を改めて感じました。
Nmr_

2020/10/14 09:18

keicha_hrsさん、ありがとうございます! AndroidKTXの関数とは表記が違ってくるのですね。 試したところ、無事に取り消し線を消すことができました。 >import androidx.core.content.edit がインポートできず調べたところ、どうやら初めにプロジェクトを作成する際にAndroidXを使用しない設定にしていたようでした。 解決しようと試行錯誤して時間が経ってしまい、お返事が遅れたことお詫び申し上げます。 また、誤スペルについてもご指摘ありがとうございます、お恥ずかしい限りです。
guest

0

pref.edit { clear() }、これだと gu.setOnClickListener { onJankenButtonTapped(it) }などと同じように、関数リテラルをひとつの引数としてedit()へ渡しているように解釈されているのだと思います。本来は引数のないedit()であるため、「Too many arguments for public abstract fun edit(): ...」と報告するエラーになっているのでしょう。

以下のようにするのが正しいのではないでしょうか。

Kotlin

1val pref = getSharedPreferences(packageName + "_preferences", MODE_PRIVATE) 2val editor = pref.edit() 3editor.clear() 4// editor.commit()

投稿2020/10/13 11:06

dodox86

総合スコア9256

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Nmr_

2020/10/13 11:37

無事に解決することができました! 文法が間違っていたのですね、もう少し参考書を熟読して基礎から固めようと思います。 わかりやすい回答をありがとうございました。
dodox86

2020/10/14 09:23

>@質問者 Nmr_さん 可能であればこちらの回答にBAを移行してください。こちらの方が質問に対して適切な回答だと思います。
Nmr_

2020/10/14 11:13

>dodox86さん BAを移行させていただきました。 どちらの回答も大変勉強になりました、ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問