🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

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

Android Studio

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

Q&A

解決済

2回答

1393閲覧

MainActivityとSubActivityからSharedPreferencesのEditorを使おうとするとエラーが起きてしまう

numatuka

総合スコア9

Java

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

Android Studio

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

0グッド

2クリップ

投稿2019/12/01 20:00

編集2019/12/02 02:57

#実現したいこと
MainActivity内でEditorを利用して作ったデータを、SubActivity内でEditorを使って上書きしたいです。

#発生している問題
MainActivityでEditorを宣言するところまでは上手くいきますが、SubActivity内でEditorを宣言するとその瞬間アプリが落ちてしまいデータの上書きをすることが出来ていません。
デバッグを行うと、Sub.javaでのdatastoreがnullになっていました。
goSubb()内のEditor editor = dataStore.edit()を実行しようとしたところでLooper.javaが呼び出されて、

this=com.android.internal.os.ZygoteInit$MethodAndArgsCaller ex=java.lang.reflect.InvocationTargetException cause=java.lang.NullPointerException: Attempt to invoke interface method 'android.content.SharedPreferences$Editor android.content.SharedPreferences.edit()' on a null object reference

というエラーメッセージと共にアプリが終了します。
また、Sub.javaのgoSubb内で

dataStore = getSharedPreferences("DataStore", MODE_PRIVATE);

を宣言してdataStoreにMainActivityで作ったデータを呼び出そうとしましたが、

Cannot resolve method 'getSharedPreferences(java.lang.String, int)'

と出てしまいgetSharedPreferencesが赤字になって呼び出すことが出来ません。datastoreにMainActivity内で入れたデータを呼び出す方法とgetSharedPreferencesでSubActivityに呼び出す方法、間違った文は無いか教えていただけると幸いです。

#該当のソースコード

xml

1//activity_main.xml 2<?xml version="1.0" encoding="utf-8"?> 3<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 4 xmlns:app="http://schemas.android.com/apk/res-auto" 5 xmlns:tools="http://schemas.android.com/tools" 6 android:layout_width="match_parent" 7 android:layout_height="match_parent" 8 tools:context=".MainActivity"> 9 10 <TextView 11 android:id="@+id/textView" 12 android:layout_width="wrap_content" 13 android:layout_height="wrap_content" 14 android:text="Hello World!" 15 app:layout_constraintBottom_toBottomOf="parent" 16 app:layout_constraintLeft_toLeftOf="parent" 17 app:layout_constraintRight_toRightOf="parent" 18 app:layout_constraintTop_toTopOf="parent" /> 19 20 <Button 21 android:id="@+id/button" 22 android:layout_width="wrap_content" 23 android:layout_height="wrap_content" 24 android:layout_marginStart="8dp" 25 android:layout_marginTop="8dp" 26 android:layout_marginEnd="8dp" 27 android:layout_marginBottom="8dp" 28 android:text="Button" 29 app:layout_constraintBottom_toBottomOf="parent" 30 app:layout_constraintEnd_toEndOf="parent" 31 app:layout_constraintHorizontal_bias="0.517" 32 app:layout_constraintStart_toStartOf="parent" 33 app:layout_constraintTop_toBottomOf="@+id/textView" 34 app:layout_constraintVertical_bias="0.174" /> 35 36 <Button 37 android:id="@+id/button3" 38 android:layout_width="wrap_content" 39 android:layout_height="wrap_content" 40 android:layout_marginStart="8dp" 41 android:layout_marginTop="8dp" 42 android:layout_marginEnd="8dp" 43 android:layout_marginBottom="8dp" 44 android:text="Button" 45 app:layout_constraintBottom_toBottomOf="parent" 46 app:layout_constraintEnd_toEndOf="parent" 47 app:layout_constraintHorizontal_bias="0.517" 48 app:layout_constraintStart_toStartOf="parent" 49 app:layout_constraintTop_toBottomOf="@+id/button" 50 app:layout_constraintVertical_bias="0.124" /> 51 52</android.support.constraint.ConstraintLayout>

java

1MainActivity.java 2package com.example.intenttest; 3 4import android.content.SharedPreferences; 5import android.content.SharedPreferences.Editor; 6import android.support.v7.app.AppCompatActivity; 7import android.os.Bundle; 8import android.view.View; 9import android.widget.Button; 10import android.widget.TextView; 11 12public class MainActivity extends AppCompatActivity { 13 private Sub sub; 14 SharedPreferences dataStore; 15 @Override 16 protected void onCreate(Bundle savedInstanceState) { 17 super.onCreate(savedInstanceState); 18 setContentView(R.layout.activity_main); 19 dataStore = getSharedPreferences("DataStore", MODE_PRIVATE); 20 Editor editor = dataStore.edit(); 21 String fragmentId = "送るよ"; 22 editor.putString("fragmentId", fragmentId); 23 editor.commit(); 24 Button go = findViewById(R.id.button); 25 Button ret = findViewById(R.id.button3); 26 String res=""; 27 sub =new Sub(MainActivity.this); 28 29 go.setOnClickListener(new View.OnClickListener() { 30 @Override 31 public void onClick(View view) { 32 sub.goSubb(MainActivity.this); 33 TextView kekka = findViewById(R.id.textView); 34 String str = dataStore.getString("fragmentId", "Nothing"); 35 kekka.setText(str); 36 } 37 }); 38 ret.setOnClickListener(new View.OnClickListener() { 39 @Override 40 public void onClick(View view) { 41 sub.ret(MainActivity.this); 42 } 43 }); 44 45 } 46}

java

1Sub.java 2package com.example.intenttest; 3 4import android.content.SharedPreferences; 5import android.content.SharedPreferences.Editor; 6import android.widget.TextView; 7 8import static android.app.Activity.RESULT_OK; 9 10class Sub { 11 SharedPreferences dataStore; 12 13 String res = ""; 14 15 Sub(MainActivity mainActivity) { 16 TextView kekka = (TextView) mainActivity.findViewById(R.id.textView); 17 } 18 public void goSubb(MainActivity mainActivity) { 19 TextView kekka = (TextView) mainActivity.findViewById(R.id.textView); 20 Editor editor = dataStore.edit(); 21 String fragmentId2 = "半分成功"; 22 editor.putString("fragmentId",fragmentId2); 23 String ketu=dataStore.getString("fragmentId", "Nothing"); 24 } 25 26 27 public void ret(MainActivity mainActivity) { 28 TextView kekka = (TextView) mainActivity.findViewById(R.id.textView); 29 kekka.setText("かえり" + res); 30 } 31}

#自分で調べたこと
別Activityでのデータの呼び出しや、データの上書き等探しましたがデータの呼び出しまでは教えているサイトが有りましたが、自分の知識では上手く呼び出すことが出来ず、上書きに関しては見つかりませんでした。

#環境
windows10
androidstudio 3.4.1

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

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

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

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

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

dodox86

2019/12/01 23:22

MainActivityではキー名を"fragmentId" としていますが、Sub.goSubbメソッドでは"flagmentId"とキー名が不一致です。動作しない原因のひとつだと思いますので、そこを確認してから、必要に応じて質問を続けてください。今のままではSubActivityをどのように呼んで、Subクラスを使っているのかも分かりません。呼び方によってはそこに問題があることもあります。 それと、「アプリが落ちている」だけでは詳細が分かりません。たいていはExceptionが起きています。デバッグに限界がありますので、Android Studioのデバッガーを使うように(使えるように)しましょう。
numatuka

2019/12/02 03:00

ご指摘ありがとうございます。文の間違いを修正して、デバッガーでのエラーメッセージを追記しました。次回からは何が原因で停止しているかデバッガーで確認するようにします、アドバイスありがとうございます。
guest

回答2

0

自己解決

java

1 public void goSubb(MainActivity mainActivity) { 2 TextView kekka = (TextView) mainActivity.findViewById(R.id.textView); 3 Editor editor = dataStore.edit(); 4 String fragmentId2 = "半分成功"; 5 editor.putString("fragmentId",fragmentId2); 6 String ketu=dataStore.getString("fragmentId", "Nothing"); 7 }

Sub.javaにおけるこの部分を

java

1 public void goSubb(MainActivity mainActivity) { 2 TextView kekka = (TextView) mainActivity.findViewById(R.id.textView); 3 dataStore = mainActivity.dataStore; 4 Editor editor = dataStore.edit(); 5 String fragmentId = "半分成功"; 6 editor.putString("fragmentId",fragmentId); 7 String ketu=dataStore.getString("fragmentId", "Nothing"); 8 editor.commit(); 9 }

このように追記した所、無事呼び出すことが出来ました。回答、アドバイス、ありがとうございました。

投稿2019/12/02 03:52

numatuka

総合スコア9

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

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

0

メインと比較してサブは最初の1行目と最後の1行がないのが原因かと考えます。

java

1 dataStore = getSharedPreferences("DataStore", MODE_PRIVATE); 2 Editor editor = dataStore.edit(); 3 String fragmentId = "送るよ"; 4 editor.putString("fragmentId", fragmentId); 5 editor.commit();

投稿2019/12/02 03:01

jun74

総合スコア338

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

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

numatuka

2019/12/02 03:23

回答ありがとうございます。回答に書かれた通りの事を実行しましたが、 dataStore = getSharedPreferences("DataStore", MODE_PRIVATE); をgoSubb()で宣言しようとすると Cannot resolve method 'getSharedPreferences(java.lang.String, int)' というメッセージが出てgetSharedPreferencesが利用できません。
jun74

2019/12/02 03:36 編集

getSharedPreferences("DataStore", getApplicationContext().MODE_PRIVATE); 上記でどうでしょうか? Activity、Serviceで出来てたことが、それ以外で何かエラーが出たときは「getApplicationContext().」を付けると大抵上手く行きます。
numatuka

2019/12/02 03:49

再度回答ありがとうございます。 dataStore = mainActivity.dataStore; アドバイスを受けて1つ目の文章を弄っていた所、予測でこのような文が出てきて実行した所、無事解決しました。 回答していただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問