java - 安卓 : saving value for app language

标签 java android android-activity sharedpreferences

我希望我的应用程序中具有语言更改功能,该功能可以提供用户功能来从设置更改应用程序语言,但在开始时我希望打开默认应用程序,因此我创建了虚拟项目来测试我正在访问的位置来自类的语言首选项是语言的定义因素,这里是它的代码(显然我知道我没有以正确的方式使用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();

            }
        });
    }

以及主要 Activity ,如果语言是不同的代码,我将更改文本值:

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");
        }
    }

我正在使用共享首选项来保存数据,但在开始时 Activity 关闭并且不响应错误显示。感谢任何帮助。

错误日志:

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

最佳答案

正如评论中提到的,最有可能的是设置变量是问题所在。

尝试在 onCreate() 方法中初始化它。

@Override
protected void onCreate(Bundle state){
   super.onCreate(state);

SharedPreferences settings = getSharedPreferences("mysettings", Context.MODE_PRIVATE);

}

您可以找到有关如何使用这些共享首选项的更多信息 here .

<小时/>

根据您的示例:

 LanguagePreferences l = new LanguagePreferences();

您将在此处创建一个新的 Activity 对象。 你不应该这样做。 Activity 由 android 管理。您应该使用生命周期方法和回调来与它们交互。 仅将语言存储在共享首选项中,而不是存储在 Activity 的成员变量中。

关于java - 安卓 : saving value for app language,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32522119/

相关文章:

android - 如何更改首选项屏幕中的开关按钮颜色?

android - 如何在 Android 中更新 TextView 的文本?

java - 需要使用 sudo 用户执行脚本文件 - 从 teamcity 运行

java - Jenkins 构建 - 参数化的 Maven 目标

android - 在 ListView 中编辑列表项

android - 通过 Paypal 网关使用 Google Pay

android - 需要知道什么包创建/恢复了我的 Activity

android - onActivityResult 从未在 TabActivity 中被调用

java - 如何使用 Java 中的 xslt 从纯文本中读取所有数据?

java - java中每个连接的线程与所有连接的一个线程