首页 文章

Android共享首选项崩溃

提问于
浏览
1

当我将它放入手机进行调试时,此活动崩溃,我只是添加了存储变量的部分 . 我做错什么了吗?

它是一个活动,如果他们之前设置了它们,它们应该获得当前变量,用户也可以设置它们 .

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();


        }
    }
}

更新崩溃日志:

03-18 15:29:59.477 7801-7801 / com.software.roux.diabcalc E / AndroidRuntime:FATAL EXCEPTION:main进程:com.software.roux.diabcalc,PID:7801 java.lang.RuntimeException:无法实例化activity ComponentInfo {com.software.roux.diabcalc / com.software.roux.diabcalc.Settings}:java.lang.NullPointerException:尝试调用虚方法'android.content.SharedPreferences android.content.Context.getSharedPreferences(java.lang) .string,int)'在android.app.ActivityThread.perleLaunchActivity(ActivityThread.java:30:94)上的空对象引用,位于android.app.ActivityThread.access $ 1100的android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3350) (ActivityThread.java:222)在android.app.A.运行时,Android.O.Roper.loop(Looper . )上的android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1795)位于android.os.Handler.dispatchMessage(Handler.java:102) . java:158)在android.app.ActivityThread.main(ActivityThread.java:7229)的java.lang.reflect.Method.invoke(Native Method)com.android.in com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)中的ternal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1230)引起:java.lang.NullPointerException:尝试调用虚方法' android.content.SharedPreferences android.content.Context.getSharedPreferences(java.lang.String,int)'在com.software.roux.diabcalc上的android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:185)上的空对象引用上.Settings . (Settings.java:21)在android.app.ActivityThread.performLaunchActivity(ActivityThread.java)的android.app.Instrumentation.newActivity(Instrumentation.java:1095)的java.lang.Class.newInstance(Native Method)中 . 3084)在Android.app.A活动时,我在Android.app.ActivityThread.access $ 1100(ActivityThread.java:222)的android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3350).ActivityThread $ H.handleMessage(ActivityThread.java:1795)在Android.app.Handler.dispatchMessage(Handler.java:102)android.app.Looper.loop(Looper.java:158)android.app .ActivityThread.main(ActivityThread.java:7229)位于com.android的com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1230)的java.lang.reflect.Method.invoke(Native Method) .internal.os.ZygoteInit.main(ZygoteInit.java:1120)

2 回答

  • 1

    稍后再启动 SharedPreferences mPrefs . 在 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 变量的地址保存在内存中 . 要检索文本,请使用:

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

  • 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);
        ...
        ...
    

相关问题