Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 当我使用;listPreferences.setvalue();活动创建两次!!如何解决这个问题?_Android_Sharedpreferences_Listpreference_Setvalue - Fatal编程技术网

Android 当我使用;listPreferences.setvalue();活动创建两次!!如何解决这个问题?

Android 当我使用;listPreferences.setvalue();活动创建两次!!如何解决这个问题?,android,sharedpreferences,listpreference,setvalue,Android,Sharedpreferences,Listpreference,Setvalue,我正在开发一个android项目,该项目有一个使用“SharedReferences”的应用程序设置活动,允许用户从区域设置列表中选择区域设置 当我使用“listPreferences.setvalue()”根据当前语言环境设置默认选定值时,SettingsActivity会创建两次 以下是我的代码: private void setLanguagePrefDefaultValues() { // Current Locale Locale sysLocale = getReso

我正在开发一个android项目,该项目有一个使用“SharedReferences”的应用程序设置活动,允许用户从区域设置列表中选择区域设置

当我使用“listPreferences.setvalue()”根据当前语言环境设置默认选定值时,SettingsActivity会创建两次

以下是我的代码:

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我感谢你的关心现在我更好地理解了背后的原因。更新了答案。