I would like to know how to get data from preference activity when my app starts / resume.
i have a preference activity where the user is able to select the app’s locale, the problem seems that when the app starts it sometimes fails to read the preferences from the main activity which causes a forceclose. here is some code that i have.
Please help, Thanks
import java.util.Locale;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.graphics.PixelFormat;
import android.graphics.Typeface;
import android.net.Uri;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.ImageButton;
import android.widget.TextView;
public class Main extends Activity {
/** Called when the activity is first created. */
String ListPreference;
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
// Locale
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
private void getPrefs() {
// Get the xml/preferences.xml preferences
SharedPreferences prefs = PreferenceManager
.getDefaultSharedPreferences(getBaseContext());
ListPreference = prefs.getString("listPref", "French");
if (ListPreference.equals("1")) {//do something
String languageToLoad = "fr";
Locale locale = new Locale(languageToLoad);
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config,
getBaseContext().getResources().getDisplayMetrics());
}
if (ListPreference.equals("2")) {//do something
String languageToLoad = "en";
Locale locale = new Locale(languageToLoad);
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config,
getBaseContext().getResources().getDisplayMetrics());
}
}
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
// END locale Code
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
screenOn();
setup();
getPrefs();
PreferenceManager.setDefaultValues(this, R.xml.preference, false);
this.overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
}
private void setup() {
text1= (TextView) findViewById(R.id.Main_Action_Bar_Text);
Button1= (ImageButton) findViewById(R.id.sample);
Button2 = (ImageButton) findViewById(R.id.sample);
Button3 = (ImageButton) findViewById(R.id.sample);
Button4 = (ImageButton) findViewById(R.id.sample);
text2= (TextView) findViewById(R.id.sample);
text3= (TextView) findViewById(R.id.sample);
text4= (TextView) findViewById(R.id.sample);
text5= (TextView) findViewById(R.id.sample);
Typeface font = Typeface.createFromAsset(getAssets(), "font/kb.ttf");
}
@Override
protected void onResume() {
super.onResume();
getPrefs();
setup();
}
}
this is the preferences.xml in the res/xml folder
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:title="Language">
<ListPreference
android:title="Select Language"
android:key="listPref"
android:defaultValue="1"
android:entries="@array/Language"
android:entryValues="@array/listValues" />
</PreferenceCategory>
</PreferenceScreen>
error log
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp.information.Main}:
android.view.InflateException: Binary XML file line #5: Error inflating class java.lang.reflect.Constructor
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1651)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
at android.app.ActivityThread.access$1500(ActivityThread.java:117)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3687)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.view.InflateException: Binary XML file line #5: Error inflating class java.lang.reflect.Constructor
at android.preference.GenericInflater.createItem(GenericInflater.java:397)
at android.preference.GenericInflater.onCreateItem(GenericInflater.java:417)
at android.preference.GenericInflater.createItemFromTag(GenericInflater.java:428)
at android.preference.GenericInflater.rInflate(GenericInflater.java:481)
at android.preference.GenericInflater.rInflate(GenericInflater.java:493)
at android.preference.GenericInflater.inflate(GenericInflater.java:326)
at android.preference.GenericInflater.inflate(GenericInflater.java:263)
at android.preference.PreferenceManager.inflateFromResource(PreferenceManager.java:251)
at android.preference.PreferenceManager.setDefaultValues(PreferenceManager.java:444)
at android.preference.PreferenceManager.setDefaultValues(PreferenceManager.java:422)
at com.myapp.information.Main.onCreate(Main.java:168)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
... 11 more
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.constructNative(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:415)
at android.preference.GenericInflater.createItem(GenericInflater.java:383)
... 23 more
Caused by: java.lang.NullPointerException
at android.content.res.AssetManager.getResourceTextArray(AssetManager.java:214)
at android.content.res.Resources.getTextArray(Resources.java:361)
at android.content.res.TypedArray.getTextArray(TypedArray.java:628)
at android.preference.ListPreference.<init>(ListPreference.java:49)
... 26 more
// this is the line that throws exception (Main.java:168)
// I assume this line is to read the preferences when app starts
PreferenceManager.setDefaultValues(this, R.xml.preference, false);
thanks again for taking the time.
you can check the preference in onResume, you don’t need to put that in onCreate. You should look at the android life cycle again. It is very fundamental. http://developer.android.com/reference/android/app/Activity.html#onResume()