为何SharedPreferences在OnClick事件中无法正常工作?
Android代码运行异常问题解决
下面这段代码单独放置时无法正常运行,但放入onCreate()方法内即可正常执行:
Button btn_validate = (Button) findViewById(R.id.btn_verify_validate); btn_validate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { SharedPreferences sp = getSharedPreferences("CONFIG", MODE_PRIVATE); SharedPreferences.Editor spe = sp.edit(); spe.putInt("GL_ID_CLASS", 34); spe.commit();` } }
问题原因及修复方案
语法错误导致编译失败
- 代码里
spe.commit();后面多了一个多余的反引号(`),直接删掉即可 - 代码末尾缺少一个闭合的
),用来结束setOnClickListener()的参数传递,补上这个括号就能解决语法问题
- 代码里
控件初始化时机错误
findViewById()必须在Activity加载完布局(即调用setContentView()之后)才能获取到有效控件实例,否则会返回null,调用setOnClickListener()时触发空指针异常- 类的成员变量区域初始化控件的时机早于
onCreate(),此时Activity还没完成视图加载,自然拿不到控件
修复后的完整代码(放在onCreate内)
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_layout); // 替换成你的布局文件名 Button btn_validate = (Button) findViewById(R.id.btn_verify_validate); btn_validate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { SharedPreferences sp = getSharedPreferences("CONFIG", MODE_PRIVATE); SharedPreferences.Editor spe = sp.edit(); spe.putInt("GL_ID_CLASS", 34); spe.commit(); } }); }
注意事项
- 所有控件初始化操作必须放在
setContentView()之后执行 - 如果需要在多个方法中复用控件,可以在Activity类里声明成员变量,再在
onCreate()中完成初始化
内容的提问来源于stack exchange,提问作者Thiago
相关产品推荐
相关产品推荐

