我希望在我的应用程序中提供语言更改功能,它可以提供用户功能,以便从设置中更改应用程序语言,但在开始时,我希望打开默认应用程序,因此我创建了一个虚拟项目来测试它在哪个类中访问语言首选项,该类在这里定义了语言的代码(显然,我知道我没有正确地使用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管理。您应该使用生命周期方法和回调来与它们交互。只将语言存储在共享首选项中,而不是在活动的成员变量中。
https://stackoverflow.com/questions/32522119
复制相似问题