我希望在我的应用程序中提供语言更改功能,它可以提供用户功能,以便从设置中更改应用程序语言,但在开始时,我希望打开默认应用程序,因此我创建了一个虚拟项目来测试它在哪个类中访问语言首选项,该类在这里定义了语言的代码(显然,我知道我没有正确地使用sharedPreference,而且我知道错误就是因为这个原因,所以请帮助在这个应用中设置共享首选项):
public class LanguagePreferences extends Activity {
public int language;
int check;
SharedPreferences settings = getSharedPreferences("mysettings",
Context.MODE_PRIVATE);
public LanguagePreferences()
{
language=settings.getInt("language", 0);
}
public void changeLang()
{
check=settings.getInt("language",0);
if(check==0)
{
settings.edit().putInt("language", 1);
settings.edit().comment();
}
else
{
settings.edit().putInt("language", 1);
settings.edit().comment();
}
}
}并在此处设置一个按钮以更改应用程序语言--其代码:
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.change);
btnLang=(Button)findViewById(R.id.change);
btnLang.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
LanguagePreferences l= new LanguagePreferences();
l.changeLang();
}
});
}以及主要的活动,如果语言是不同的代码,我将更改文本值:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = (TextView) findViewById(R.id.text);
Button btnLang = (Button) findViewById(R.id.buttonlang);
SharedPreferences settings = getSharedPreferences("mysettings",
Context.MODE_PRIVATE);
btnLang.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent i = new Intent(MainActivity.this, Change.class);
startActivity(i);
}
});
LanguagePreferences l = new LanguagePreferences();
if (l.language == 0) {
tv.setText("Germany");
} else {
tv.setText("English");
}
}我使用共享首选项来保存数据,但是在开始时活动会关闭,并且不会响应错误显示。任何帮助都是非常感谢的。
错误日志:
09-11 17:44:26.200: D/AndroidRuntime(13952): Shutting down VM
09-11 17:44:26.200: W/dalvikvm(13952): threadid=1: thread exiting with uncaught exception (group=0x414112a0)
09-11 17:44:26.208: E/AndroidRuntime(13952): FATAL EXCEPTION: main
09-11 17:44:26.208: E/AndroidRuntime(13952): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.dummy/com.example.dummy.MainActivity}: java.lang.NullPointerException
09-11 17:44:26.208: E/AndroidRuntime(13952): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2097)
09-11 17:44:26.208: E/AndroidRuntime(13952): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2122)
09-11 17:44:26.208: E/AndroidRuntime(13952): at android.app.ActivityThread.access$600(ActivityThread.java:140)
09-11 17:44:26.208: E/AndroidRuntime(13952): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1228)
09-11 17:44:26.208: E/AndroidRuntime(13952): at android.os.Handler.dispatchMessage(Handler.java:99)
09-11 17:44:26.208: E/AndroidRuntime(13952): at android.os.Looper.loop(Looper.java:137)
09-11 17:44:26.208: E/AndroidRuntime(13952): at android.app.ActivityThread.main(ActivityThread.java:4895)
09-11 17:44:26.208: E/AndroidRuntime(13952): at java.lang.reflect.Method.invoke(Method.java:511)
09-11 17:44:26.208: E/AndroidRuntime(13952): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994)
09-11 17:44:26.208: E/AndroidRuntime(13952): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761)
09-11 17:44:26.208: E/AndroidRuntime(13952): at dalvik.system.NativeStart.main(Native Method)
09-11 17:44:26.208: E/AndroidRuntime(13952): Caused by: java.lang.NullPointerException
09-11 17:44:26.208: E/AndroidRuntime(13952): at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:101)
09-11 17:44:26.208: E/AndroidRuntime(13952): at com.example.dummy.LanguagePreferences.<init>(LanguagePreferences.java:18)
09-11 17:44:26.208: E/AndroidRuntime(13952): at com.example.dummy.MainActivity.onCreate(MainActivity.java:36)
09-11 17:44:26.208: E/AndroidRuntime(13952): at android.app.Activity.performCreate(Activity.java:5163)
09-11 17:44:26.208: E/AndroidRuntime(13952): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
09-11 17:44:26.208: E/AndroidRuntime(13952): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2061)
09-11 17:44:26.208: E/AndroidRuntime(13952): ... 11 more
09-11 17:44:43.325: I/Process(13952): Sending signal. PID: 13952 SIG: 9发布于 2015-09-11 12:48:45
正如注释中提到的,最有可能的问题是设置变量。
尝试在onCreate()方法中初始化它。
@Override
protected void onCreate(Bundle state){
super.onCreate(state);
SharedPreferences settings = getSharedPreferences("mysettings", Context.MODE_PRIVATE);
}您可以找到有关如何使用这些共享首选项这里的更多信息。
从你的例子来看:
LanguagePreferences l = new LanguagePreferences();您正在这里创建一个新的Activity对象。你不应该这么做的。活动由android管理。您应该使用生命周期方法和回调来与它们交互。只将语言存储在共享首选项中,而不是在活动的成员变量中。
发布于 2015-09-11 13:14:08
您正试图在下面一行创建一个活动实例,这是错误的。
LanguagePreferences l = new LanguagePreferences();您不能像这样到达活动的方法。可以添加应用程序类并编写公共静态方法,如下所示:
public class ApplicationClass extends Application {
public static SharedPreferences mSharedPrefs;
public static SharedPreferences.Editor mPrefsEditor;
private static ApplicationClass instance;
public ApplicationClass() {
instance = this;
}
@Override
public void onCreate() {
super.onCreate();
mSharedPrefs = getSharedPreferences("mysettings", MODE_PRIVATE);
mPrefsEditor = mSharedPrefs.edit();
}
public static SharedPreferences getmSharedPrefs() {
if (mSharedPrefs == null) {
mSharedPrefs = getContext().getSharedPreferences("mysettings",
MODE_PRIVATE);
}
return mSharedPrefs;
}
public static SharedPreferences.Editor getmPrefsEditor() {
if (mPrefsEditor == null || mSharedPrefs == null) {
mSharedPrefs = getContext().getSharedPreferences("mysettings",
MODE_PRIVATE);
mPrefsEditor = mSharedPrefs.edit();
}
return mPrefsEditor;
}
}你可以这样做:
ApplicationClass.getmPrefsEditor().putString("key","value").commit();这是:
ApplicationClass.getmSharedPrefs().getString("key");在你的活动和片段中。
https://stackoverflow.com/questions/32522119
复制相似问题