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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

解決済

SharedPreferencesの設計

tkmnusr
tkmnusr

総合スコア4

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

1回答

0評価

0クリップ

32閲覧

投稿2019/06/10 14:12

前提・実現したいこと

アプリ起動時に、SharedPreferencesの値を読み込んで、
アプリ終了時に、SharedPreferencesの値を書き込むことを考えています。
具体的には、前回のスクロールビューのスクロール位置を起動時に復元することを考えています。
スクロールビューの実装はまだしてませんが、
とりあえず、この用途でのSharedPreferencesの値の読み書きの設計についての質問です。

このようなとき、SharedPreferencesは、各メソッドごとに宣言して用意するのが適切でしょうか?
もしくはフィールドに宣言しておいた方がよいのでしょうか?

また、起動時の値の読み込みはonCreateメソッドで、終了時の値の書き込みはonDestroyメソッドで
実装するのは適切でしょうか?

また、今回はおそらくスクロール位置だけの単一のデータの読み書きとなると思いますが、
多めの複数データの読み書きとなってくると、SharedPreferencesの宣言方法はどちらが適切になるとか、
変わってきたりするものでしょうか?

試したこと

実際にそれぞれのコードを書いてみて、挙動を確認してみました。
予想に反して、データの書き込みすらできてませんでした
(既に、"string1", "value1"というキーと値のペアで保存していた場合、"string1", "value2"に書き直せないという挙動でした。)

すみません、質問が増えてしまいますが、
上記質問に加えて、今回試したコードでデータの書き換えができないのは何故でしょうか?

ご教示お願いします。

・各メソッドごとで宣言する場合。

Java

public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); String s1 = prefs.getString("string1", ""); Log.d("mytag", s1); } @Override public void onDestroy(){ super.onDestroy(); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); SharedPreferences.Editor editor = prefs.edit(); editor.putString("string1", "value1"); editor.apply(); } }

・フィールドで宣言して使い回す場合。

Java

public class MainActivity extends AppCompatActivity { SharedPreferences prefs; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); prefs = PreferenceManager.getDefaultSharedPreferences(this); String s1 = prefs.getString("string1", ""); Log.d("mytag", s1); } @Override public void onDestroy(){ super.onDestroy(); SharedPreferences.Editor editor = prefs.edit(); editor.putString("string1", "value1"); editor.apply(); } }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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