【问题标题】:Caused by: java.lang.NullPointerException: SharedPreference error [duplicate]引起:java.lang.NullPointerException:SharedPreference 错误 [重复]
【发布时间】:2018-09-23 10:48:41
【问题描述】:

我是安卓新手。我使用名为“MyPref”的共享首选项来存储和检索值。代码逻辑是,“MyPref”存储了userid、usertype(客户、司机)。在我的SplashActivity 中,我编写了以下代码。如果用户 ID 不为空且用户类型等于客户或司机,则活动应相应导航。但我收到以下错误:请帮助

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.SharedPreferences android.content.Context.getSharedPreferences(java.lang.String, int)' on a null object reference

SplashActivity:

public class SplashActivity extends AppCompatActivity {
    SharedPreferences pref;
    SharedPreferences.Editor editor;
    Context context;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);
        getWindow().setSoftInputMode(
                WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
        pref = context.getSharedPreferences("MyPref", 0);
        editor = pref.edit();
        String userid=pref.getString("userid","");
        Log.e("userid",userid);
        if(userid!=null)
        {
            String usertype=pref.getString("usertype1","");
            if(usertype.equals("customer"))
            {
                Intent customer=new Intent(SplashActivity.this, HomeFragment.class);
                startActivity(customer);
            }
            else
            {
                Intent driver=new Intent(SplashActivity.this, DriverDashboardFragment.class);
                startActivity(driver);
            }
        }
        else
        {
            Intent walk=new Intent(SplashActivity.this,WalkThroughActivity.class);
            startActivity(walk);
        }

        new Handler().postDelayed(new Runnable() {

            @Override
            public void run() {

            }
        }, 2000);
    }

    @Override
    protected void onResume() {
        super.onResume();
    }
}

【问题讨论】:

    标签: android nullpointerexception sharedpreferences


    【解决方案1】:

    从此语句中删除上下文:

    pref = context.getSharedPreferences("MyPref", 0);
    

    应该是pref = getSharedPreferences("MyPref", 0);

    您正面临这个问题,因为上下文未初始化。 这里不需要上下文引用,因为AppCompatActivity 是 Context 类的子级。所以可以直接拨打getSharedPreferences

    在此之后,您的应用程序崩溃,因为您尝试通过 startActivity 方法启动片段。要在 Activity 中启动片段:

    FragmentManager manager = getFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.add(R.id.container,new DriverDashboardFragment(),"driverDashboard");
    transaction.addToBackStack(null);
    transaction.commit();
    

    将上面的代码替换为:

    Intent driver=new Intent(SplashActivity.this, DriverDashboardFragment.class);
                    startActivity(driver);
    

    您需要在此活动的 xml 中添加此内容:

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
    

    【讨论】:

    • 我做到了,现在我得到了这个错误
    • 引起:android.content.ActivityNotFoundException:找不到明确的活动类{DriverDashboardFragment};您是否在 AndroidManifest.xml 中声明了此活动?不用去Manifest文件中初始化Fragment类吧?
    • 你能发布完整的日志吗?
    • 如果 DriverDashboardFragment 是一个片段,那么你不能通过 startActivity 方法启动一个片段
    • 对不起我的无知。我应该在哪里包含此代码?
    【解决方案2】:

    您的上下文为空

    只需在 setcontentView 之后添加这一行

     context= this;
    

    它不会崩溃..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-24
      • 1970-01-01
      • 2017-05-25
      • 2017-01-03
      • 2019-03-03
      • 2021-05-20
      • 2017-01-06
      相关资源
      最近更新 更多