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

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

ただいまの
回答率

89.70%

MainActivityのメソッドをほかのアクティビティーから呼び出す

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 193

uhsi

score 32

MainActivityのメソッドをほかのアクティビティーから呼び出すためにインスタンスを生成して実行したのですが、「SharedPreferences」を使っている部分で「java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.SharedPreferences android.content.Context.getSharedPreferences(java.lang.String, int)' on a null object reference」というエラーが出てしまいます。

Realm realm = Realm.getDefaultInstance();
        //リセット
        RealmQuery<DataModel> query = realm.where(DataModel.class);
        RealmResults<DataModel> result = query.findAll();
        realm.beginTransaction();
        result.deleteAllFromRealm();
        realm.commitTransaction();

        InputStream is = null;
        BufferedReader br = null;
        int times = 1;
        try {
            try {
                is = this.getAssets().open("data.txt");
                br = new BufferedReader(new InputStreamReader(is));
                String str;

                String wordEnTemp = null;
                String wordJpTemp = null;
                String sentenceEnTemp = null;
                String sentenceJpTemp = null;
                int indexTemp = 0;

                while ((str = br.readLine()) != null) {
                    switch (times%4){
                        case 1:
                            //単語
                            wordEnTemp = str;
                            break;
                        case 2:
                            //和訳
                            wordJpTemp = str;
                            break;
                        case 3:
                            //例文
                            sentenceEnTemp = str;
                            break;
                        case 0:
                            //和訳
                            sentenceJpTemp = str;

                            //データ保存
                            realm.beginTransaction();
                            DataModel model=realm.createObject(DataModel.class);
                            model.setIndex(indexTemp);
                            model.setWordEn(wordEnTemp);
                            model.setWordJp(wordJpTemp);
                            model.setSentenceEn(sentenceEnTemp);
                            model.setSentenceJp(sentenceJpTemp);
                            model.setProgressWord(0);
                            model.setProgressSpelling(0);
                            model.setTimeWord(0);
                            model.setTimeSpelling(0);
                            realm.commitTransaction();

                            indexTemp++;
                            break;
                    }
                    times++;
                }
            } finally {
                if (is != null) is.close();
                if (br != null) br.close();
            }
        } catch (Exception e){
        }
        //完了
        SharedPreferences preferences = getSharedPreferences("data",MODE_PRIVATE);
        SharedPreferences.Editor editor = preferences.edit();
        editor.putInt("count",1);
        editor.commit();
MainActivity main = new MainActivity();
main.loadFile();
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • jimbe

    2019/07/23 20:46

    一行のコードだけでは(想像は出来ますが)正確なことが何も分かりません.
    「実行してそのエラーが出るのを確認できる」プログラムをご提示願えますか.

    キャンセル

  • uhsi

    2019/07/23 20:53

    よろしくお願いいたします。

    キャンセル

回答 2

+1

getSharedPreferences は、ソースを見る限り context を必要としています。
上記のような使い方では、context は正常に渡らないので、ご希望の動作はエラーとなると思います。

自分なら、上記の処理を別クラスに定義して、コンストラクタか、メソッドの引数に Context を渡すようにします。

一応、MainActivity に static メソッドで、context を引数にするメソッド化すれば、共通で使用できるかと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/07/25 20:07

    ありがとうございます。Contextクラスについて説明していただけますか。

    キャンセル

  • 2019/07/25 20:07

    getSharedPreference を選択して、Ctrl+Alt+B を押してください。
    メソッドを実装している所を、参照する事ができます。

    この場合、ContextWrapper で実装されいます。
    ContextWrapper のコンストラクタは、引数に Context を使用しています。

    キャンセル

  • 2019/08/01 09:35 編集

    失礼しました。新しい質問を作成しました。

    キャンセル

checkベストアンサー

0

ご提示ありがとうございます.
MainActivity#loadFile メソッドが見当たりませんが...上の断片が loadFile の一部ということでしょうか.

アクティビティの機能は大抵システムと繋がって成り立っています. SharedPreferences もその一部です.
ですので勝手にアクティビティのインスタンスを作っても, システムと繋がっていなければ利用出来ません.
MainActivity という名前から, アプリ起動時には最初にシステムによって生成(=システムと繋がっていて)実行されているアクティビティと想像します.
loadFile を実行する場合は, その既に実行されている MainActivity の参照を(どうにか)取得して, 行う必要があるかと思います.

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/07/25 19:07

    ありがとうございます。「MainActivity の参照」とはどういった意味でしょうか。Stringの参照という意味は何となく理解できるのですが。

    キャンセル

  • 2019/07/25 22:24

    MainActivity も String も オブジェクトという点では同じです. ですので String の参照がご理解頂けていれば, MainActivity の参照も同じです.

    キャンセル

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

  • ただいまの回答率 89.70%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

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