【问题标题】:Android : saving value for app languageAndroid:为应用语言节省价值
【发布时间】:2015-09-11 11:13:51
【问题描述】:

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

【问题讨论】:

  • 抱歉在代码上添加了 edit().commit 但仍然关闭
  • 如果我删除 LanguagePreferences l = new LanguagePreferences();从主要活动中删除它的依赖错误消失了我知道它与java有关但我是java的初学者请任何建议
  • 很明显你有一个NullPointerException。最后查看错误日志的第 4 行。这意味着您对具有空值的对象执行操作。通常这是因为你在它上面调用了一个方法。检查您的 LanguagePreference 第 18 行。
  • 大约在您的日志中间您会看到Caused by: java.lang.NullPointerException。从那里向下走每一行,直到您看到自己的班级。在那里你看到它说LanguagePreferences.java:18。这意味着您需要在第 18 行检查该文件;)
  • 这一行导致错误,我通过调试知道它,你也确认 SharedPreferences settings=getSharedPreferences("myfile", Context.MODE_PRIVATE);但你能告诉我这不是使用共享偏好的正确方式吗

标签: java android android-activity sharedpreferences


【解决方案1】:

如 cmets 中所述,很可能是设置变量存在问题。

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

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

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

}

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


从你的例子:

 LanguagePreferences l = new LanguagePreferences();

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

【讨论】:

    【解决方案2】:

    您正在尝试在下面的行中创建一个 Activity 的实例,这是错误的。

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

    在您的活动和片段中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-17
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多