繁体   English   中英

Android Studio:OnResume 和 SharedPreferences 问题:运行时出现致命错误

[英]Android Studio: Issue with OnResume and SharedPreferences: Fatal Error at Runtime

全部,只是想对每个人说实话,我不知道我在做什么,哈哈。 但是我在这个项目中实现 SharedPreferences onPause\onResume 时遇到问题,我想知道是否有人可以告诉我哪里出错了。

错误详情:

`E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.androidlabs, PID: 2260
    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.androidlabs/com.example.androidlabs.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3365)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference
        at android.content.ContextWrapper.getApplicationInfo(ContextWrapper.java:173)
        at android.view.ContextThemeWrapper.getTheme(ContextThemeWrapper.java:174)
        at android.content.Context.obtainStyledAttributes(Context.java:744)
        at androidx.appcompat.app.AppCompatDelegateImpl.createSubDecor(AppCompatDelegateImpl.java:848)
        at androidx.appcompat.app.AppCompatDelegateImpl.ensureSubDecor(AppCompatDelegateImpl.java:815)
        at androidx.appcompat.app.AppCompatDelegateImpl.findViewById(AppCompatDelegateImpl.java:640)
        at androidx.appcompat.app.AppCompatActivity.findViewById(AppCompatActivity.java:259)
        at com.example.androidlabs.MainActivity.<init>(MainActivity.java:19)
        at java.lang.Class.newInstance(Native Method)
        at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:95)
        at androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:45)
        at android.app.Instrumentation.newActivity(Instrumentation.java:1253)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3353)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:223) 
        at android.app.ActivityThread.main(ActivityThread.java:7656) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) `

这是我的主要活动代码。 我可以看出问题出在 onResume(我认为!)但不知道为什么!

`package com.example.androidlabs;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    //initializing variables
    Button next = (Button) findViewById(R.id.next);
    EditText name = (EditText) findViewById(R.id.name);       //initializing variables

    public static final String SHARED_PREF = "sharedprefs";
    public static final String TEXT = "text";
    private String text;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);

        next.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                SharedPreferences sh = getSharedPreferences(SHARED_PREF, MODE_PRIVATE);
                SharedPreferences.Editor editor = sh.edit();
                editor.putString("name", name.getText().toString());
                editor.apply();
                openNameActivity();
            }
        });

    }

        @Override
        protected void onResume() {
            super.onResume();
            SharedPreferences sh = getSharedPreferences(SHARED_PREF, MODE_PRIVATE);
            String savedName = sh.getString("name",null);
            if (savedName != null){
                name.setText(savedName);
            }

        }

       @Override
        protected void onPause() {
            super.onPause();
           SharedPreferences sh = getSharedPreferences(SHARED_PREF, MODE_PRIVATE);
            //save the users name in My Shared Pref
            SharedPreferences.Editor editor = sh.edit();
            editor.putString("name", name.getText().toString());
            editor.apply();

        }

    public void openNameActivity(){
        EditText name = (EditText) findViewById(R.id.name);
        String nameText = name.getText().toString();

        Intent intent = new Intent(MainActivity.this, NameActivity.class);
        intent.putExtra("name", nameText);
        startActivityForResult(intent, 1);
    };

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 1) {
            if(resultCode == RESULT_OK){
                int result = data.getIntExtra("namePref", 0);
                if(result == 0){
                    Toast.makeText(MainActivity.this,"Choose a new name", Toast.LENGTH_LONG).show();
                }else{
                    finishAndRemoveTask();
                }
            }
            if(resultCode == RESULT_CANCELED){
                Toast.makeText(MainActivity.this,"Something went wrong", Toast.LENGTH_LONG).show();
            }

        }

    }
}`

打开您的应用程序时,您的应用程序崩溃了吗? 看起来你正在错误的地方初始化你的按钮和 editText

你能把下面提到的代码移到onCreate方法并将它放在setContentView方法的下面吗

next = (Button) findViewById(R.id.next);
name = (EditText) findViewById(R.id.name);

而且你还需要声明下一个并命名两个变量

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM