2017-03-18 12 views
1

このアクティビティを携帯電話に入れてデバッグすると、このアクティビティがクラッシュし、変数を格納する部分が追加されました。私は間違ったことをしましたか?Android共有設定がクラッシュする

これはアクティビティであり、以前の変数を設定した場合は現在の変数を取得し、ユーザーが設定することもできます。

package com.software.roux.diabcalc; 

import android.content.Intent; 
import android.content.SharedPreferences; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.EditText; 

import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.io.PrintWriter; 

import static com.software.roux.diabcalc.R.id.bolus; 

public class Settings extends AppCompatActivity { 

    SharedPreferences mPrefs = getSharedPreferences("label", 0); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_settings); 
     setTitle("Insulin Calculator by Ben Roux"); 

     String bolusString = mPrefs.getString("bolus", "0"); 
     String corrString = mPrefs.getString("correction", "0"); 
     String lowString = mPrefs.getString("low", "0"); 
     String highString = mPrefs.getString("high", "0"); 

     EditText b1 = (EditText)findViewById(R.id.bolus); 
     b1.setText(bolusString); 

     EditText b2 = (EditText)findViewById(R.id.correction); 
     b2.setText(corrString); 

     EditText b3 = (EditText)findViewById(R.id.targetlow); 
     b3.setText(lowString); 

     EditText b4 = (EditText)findViewById(R.id.targethigh); 
     b4.setText(highString); 
    } 

    public void switchclick(View a) { 
     if (a.getId() == R.id.backbutton) { 
      Intent myIntent = new Intent(Settings.this, MainActivity.class); 
      Settings.this.startActivity(myIntent); 
     } 
    } 

    public void setclick(View b) { 
     if (b.getId() == R.id.setter) { 

      EditText b1 = (EditText)findViewById(R.id.bolus); 
      String bolussave = ""+b1; 
      SharedPreferences.Editor mEditor1 = mPrefs.edit(); 
      mEditor1.putString("bolus", bolussave).commit(); 

      EditText b2 = (EditText)findViewById(R.id.correction); 
      String corrsave = ""+b2; 
      SharedPreferences.Editor mEditor2 = mPrefs.edit(); 
      mEditor2.putString("correction", corrsave).commit(); 


      EditText b3 = (EditText)findViewById(R.id.targetlow); 
      String lowsave = ""+b3; 
      SharedPreferences.Editor mEditor3 = mPrefs.edit(); 
      mEditor3.putString("low", lowsave).commit(); 


      EditText b4 = (EditText)findViewById(R.id.targethigh); 
      String highsave = ""+b4; 
      SharedPreferences.Editor mEditor4 = mPrefs.edit(); 
      mEditor4.putString("high", highsave).commit(); 


     } 
    } 
} 

UPDATES CRASH LOG:

3月18日15:29:59.477 7801から7801/com.software.roux.diabcalc E/AndroidRuntime:致命的な例外:メイン プロセス:COM。パラメータ:software.roux.diabcalc、PID:7801 java.lang.RuntimeException:アクティビティをインスタンス化できません。 ComponentInfo {com.software.roux.diabcalc/com.software.roux.diabcalc.Settings}: java.lang.NullPointerException:試行仮想メソッド 'android.contentを呼び出します。 android.app.ActivityThreadでSharedPreferences android.content.Context.getSharedPreferences android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3094)でヌルオブジェクト参照 に(java.lang.Stringで、INT)」 android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1795)android.osで でandroid.app.ActivityThread.access $ 1100(ActivityThread.java:222) で.handleLaunchActivity(ActivityThread.java:3350) .Handler.dispatchMessage(Handler.java:102) とandroid.os.Looper.loop(Looper.java:158) android.app.ActivityThread.main(ActivityThread.java:7229) のjava.lang.reflect.Method.invoke(ネイティブメソッド) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit。 Javaの:java.lang.NullPointerExceptionが::1230)によって引き起こさ com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) で仮想 メソッドを呼び出そうと「android.content.SharedPreferences android.content .Context.getSharedPreferences(java.lang.String、int) 'ヌルオブジェクトリファレンスの at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:185) com.software.roux.diabcalc.Settings。(Settings.java:21) java.lang.Class.newInstance(ネイティブメソッド) android.app.Instrumentation.newActivity(Instrumentation.java:1095) at android.app.ActivityThread.access $ 1100(ActivityThread.java:222)で android.app.ActivityThread.performLaunchActivity android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3350)で(ActivityThread.java:3084) at android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1795) android.os.Han dler.dispatchMessage(Handler.java:102)android.os.Looper.loop(Looper.java:158)で android.app.ActivityThread.main(ActivityThread.java:7229)で れるjava.lang.reflectで 。 Method.invoke(ネイティブメソッド) ( )com.android.internal.os.ZygoteInit $ MethodAndArgsCaller。実行com.android.internal.os.ZygoteInit.mainで(ZygoteInit.java:1230) (ZygoteInit.java:1120)

+0

クラッシュログを提供できますか? –

+0

彼らはどこにいますか?アンドロイドスタジオを使用します。 –

+0

接続されたデバイスまたはエミュレータでプログラムを実行している場合は、logcatにログが表示されます。 Android Studioの下部バーで「Android Monitor」を検索します。 –

答えて

1

ただ、後でSharedPreferences mPrefsをinitate。 onCreateの方法。

contextは、onCreateメソッドの後でのみ初期化されます。 だから、これは仕事をしなければならない:他の質問として

SharedPreferences mPrefs; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_settings); 
     setTitle("Insulin Calculator by Ben Roux"); 
mPrefs= getSharedPreferences("label", 0); 

を、あなたの現在のコードでは、あなただけのメモリにEditText変数のアドレスを保存します。テキストをretriveするには、これを使用する:

String bolussave = ""+b1.getText().toString();

+0

私はそれを修正しましたが、今は別の問題があります。最初は変数は0ですが、設定した後、アプリを閉じてからもう一度開くと、 "android.support.v7.widget ... app:id/targethigh"と表示されます。これは参照IDであり、値ではありません?そして、どうすれば実際の価値に変換できますか? –

+0

@BenRoux、更新 – Vyacheslav

0

があなたのOnCreateメソッドの内部で、あなたのmPrefsのインスタンスを作成してみます。

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_settings); 
    setTitle("Insulin Calculator by Ben Roux"); 

    String bolusString = mPrefs.getString("bolus", "0"); 
    mPrefs = getSharedPreferences("label", 0); 
    ... 
    ... 
関連する問題