Android 当我使用;listPreferences.setvalue();活动创建两次!!如何解决这个问题?
我正在开发一个android项目,该项目有一个使用“SharedReferences”的应用程序设置活动,允许用户从区域设置列表中选择区域设置 当我使用“listPreferences.setvalue()”根据当前语言环境设置默认选定值时,SettingsActivity会创建两次 以下是我的代码:Android 当我使用;listPreferences.setvalue();活动创建两次!!如何解决这个问题?,android,sharedpreferences,listpreference,setvalue,Android,Sharedpreferences,Listpreference,Setvalue,我正在开发一个android项目,该项目有一个使用“SharedReferences”的应用程序设置活动,允许用户从区域设置列表中选择区域设置 当我使用“listPreferences.setvalue()”根据当前语言环境设置默认选定值时,SettingsActivity会创建两次 以下是我的代码: private void setLanguagePrefDefaultValues() { // Current Locale Locale sysLocale = getReso
private void setLanguagePrefDefaultValues() {
// Current Locale
Locale sysLocale = getResources().getConfiguration().locale;
// Language Preference
ListPreference languagePref = (ListPreference) findPreference(getString(R.string.pref_language_key));
// Edit Preference Summary
languagePref.setSummary(sysLocale.getDisplayName(sysLocale));
// Set Language Preference to Current Locale
if (sysLocale.getCountry() != "") {
languagePref.setValue(sysLocale.getLanguage() + "_" + sysLocale.getCountry());
} else {
languagePref.setValue(sysLocale.getLanguage());
}
}
此方法是从onCreate()方法调用的
我注意到,当调用“setSummary(…)”方法时没有问题,但当调用“setValue()”时会出现问题
设置活动类:
import java.util.Locale;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceCategory;
import android.view.View;
import android.view.Window;
import android.widget.TextView;
import com.telephoenic.simgateway.R;
/**
* Settings Activity
*
* @author Abd Alrahman Shoman
* @since September 2013
* @version 1.0.0
*
*/
public class SettingsActivity extends PreferenceActivity implements
SharedPreferences.OnSharedPreferenceChangeListener {
public static boolean updatedLocale = false;
@Override
public void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.settings_pref_file);
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,
R.layout.custom_title_bar);
TextView title = (TextView) findViewById(R.id.textView_titleBar_title);
title.setText(getResources()
.getString(R.string.title_activity_settings));
getPreferenceScreen().getSharedPreferences()
.registerOnSharedPreferenceChangeListener(this);
hideFirstLaunchPref();
setLanguagePrefDefaultValues();
setProfileEditPrefIntent();
}
@Override
protected void onStop() {
super.onStop();
getPreferenceScreen().getSharedPreferences()
.unregisterOnSharedPreferenceChangeListener(this);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
String key) {
if (key.equals(getString(R.string.pref_language_key))) {
Locale locale = null;
String languageCode = sharedPreferences.getString(getString(R.string.pref_language_key), "");
if (languageCode.length() > 2) {
char ch3 = languageCode.charAt(2);
if (ch3 == '_') {
String language = languageCode.substring(0, 2);
String country = languageCode.substring(3, 5);
locale = new Locale(language, country);
}
} else {
locale = new Locale(languageCode);
}
Configuration config = new Configuration();
config.locale = locale;
getApplicationContext().getResources().updateConfiguration(config,
getBaseContext().getResources().getDisplayMetrics());
refresh();
updatedLocale = true;
}
}
/**
* Hide FirstLaunchPref from preference screen
*
*/
private void hideFirstLaunchPref() {
// First Launch Preference
PreferenceCategory firstlaunchPref = (PreferenceCategory) findPreference(getString(R.string.pref_app_first_launch));
// Hide First Launch Preference
getPreferenceScreen().removePreference(firstlaunchPref);
}
/**
* Set LanguagePref default Values (summary, selected language)
*
*/
private void setLanguagePrefDefaultValues() {
// Current Locale
Locale sysLocale = getResources().getConfiguration().locale;
// Language Preference
ListPreference languagePref = (ListPreference) findPreference(getString(R.string.pref_language_key));
// Edit Preference Summary
languagePref.setSummary(sysLocale.getDisplayName(sysLocale));
// Set Language Preference to Current Locale
if (sysLocale.getCountry() != "") {
languagePref.setValue(sysLocale.getLanguage() + "_" + sysLocale.getCountry());
} else {
languagePref.setValue(sysLocale.getLanguage());
}
}
/**
* Set ProfileEditPref Intent
*
*/
private void setProfileEditPrefIntent() {
// Start PoS Profile Activity onClick
Preference profile = (Preference) findPreference(getString(R.string.pref_profile_edit_key));
profile.setIntent(new Intent(SettingsActivity.this,
PosProfileActivity.class));
}
/**
* Restart activity to reflect locale change
*
*/
private void refresh() {
Intent intent = getIntent();
overridePendingTransition(0, 0);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
finish();
overridePendingTransition(0, 0);
startActivity(intent);
}
/**
* Back to previous activity
*
* @param View
* v
*/
public void back(View v) {
finish();
}
}尝试注释掉你的refresh()方法 当您输入SettingsActivity时,将调用onSharedPreferenceChanged 我也不认为有必要使用这个refresh()方法 如果这不起作用,我会更深入地研究它 这肯定是原因。。再看一遍:
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
String key) {
if (key.equals(getString(R.string.pref_language_key))) {
... // this is called when setLanguagePrefDefaultValues() sets value
refresh()
}
}
private void refresh() {
// start a new SettingsActivity, why you do this in the first place, I do not know
Intent intent = getIntent();
overridePendingTransition(0, 0);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
finish();
overridePendingTransition(0, 0);
startActivity(intent);
}
尝试将刷新方法重写为:
private void refresh() {
// ok it is to reflect the language update, i see :)
Intent intent = getIntent();
overridePendingTransition(0, 0);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION | Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(intent);
finish();
}
否则,请参见:[
[1] :获取从后台删除当前活动的更多选项。我不确定您所说的SettingsActivity是指调用两次。顺便说一句,对于字符串比较,始终使用等于:sysLocale.getCountry().equals(“”)或sysLocale.getCountry().isEmpty()据我所知,您的代码从未调用SettingsActivity,因此我认为您的意思不是您在问题标题中所写的内容。感谢cYrixmorten提供有关字符串比较的建议。“SettingsActivity”是负责创建首选项屏幕的活动,而“setLanguagePrefDefaultValues()”是从其名称调用的“onCreate()”方法。我认为当我调用“languagePref.setValue(…)”方法时,“SettingsActivity”隐式重复,因此如果我想返回到上一个活动,我必须按两次后退按钮!!这很奇怪。无法找出setLanguagePrefDefaultValues()的任何原因应该对此负责。SettingsActivity是否太大,无法在此处添加以获得完整的图片?好的,我将添加整个Setting Activity类实际上,“刷新”方法用于在更改后在首选项屏幕上反映区域设置更改(使用新区域设置重新显示视图)。我确实对此进行了评论,是的,你是对的。问题没有出现,但当你评论“setValue(…)”并保留“refresh”方法时,问题就消失了。很抱歉,我没有提到问题仅在应用程序第一次运行时出现(在第一次应用程序启动时)!!!谢谢你cYrixmorten我感谢你的关心现在我更好地理解了背后的原因。更新了答案。