Удвоенные элементы в настройках активности - PullRequest
0 голосов
/ 30 апреля 2018

У меня возникла досадная и бессмысленная проблема, связанная с запуском моего приложения: в моем приложении есть страница настроек, на которой есть только две кнопки. Если вы посмотрите на XML-файл, который увидите сами:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

    <EditTextPreference
        android:capitalize="words"
        android:defaultValue="@string/pref_default_display_name"
        android:inputType="textCapWords"
        android:key="name"
        android:maxLines="1"
        android:selectAllOnFocus="true"
        android:singleLine="true"
        android:title="@string/pref_title_display_name" />

    <ListPreference
        android:defaultValue="en"
        android:entries="@array/lang_select"
        android:entryValues="@array/lang_select_values"
        android:key="pref_language"
        android:negativeButtonText="@null"
        android:positiveButtonText="@null"
        android:title="@string/language_setting" />

</PreferenceScreen>

Но, когда приложение собирается и запускается, если вы открываете страницу настроек, вы видите, как две кнопки удвоились, как показано ниже:

Снимок экрана с видом

При необходимости вот также код Java:

package com.lorenzomoscati.remover;

import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceManager;
import android.util.DisplayMetrics;
import android.view.MenuItem;
import android.support.v4.app.NavUtils;

import java.util.Locale;

public class SettingsActivity extends AppCompatPreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener {

    public static final String KEY_PREF_LANGUAGE = "pref_language";
    public String languagePref_ID;

    private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() {
        @Override
        public boolean onPreferenceChange(Preference preference, Object value) {
            String stringValue = value.toString();

            if (preference instanceof ListPreference) {
                ListPreference listPreference = (ListPreference) preference;
                int index = listPreference.findIndexOfValue(stringValue);

                preference.setSummary(
                        index >= 0
                                ? listPreference.getEntries()[index]
                                : null);

            } else {
                preference.setSummary(stringValue);
            }
            return true;
        }

    };

    private static void bindPreferenceSummaryToValue(Preference preference) {
        preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener);

        sBindPreferenceSummaryToValueListener.onPreferenceChange(preference,
                PreferenceManager
                        .getDefaultSharedPreferences(preference.getContext())
                        .getString(preference.getKey(), ""));
    }

    @SuppressWarnings("deprecation")
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
        SharedPreferences.OnSharedPreferenceChangeListener listener =
                new SharedPreferences.OnSharedPreferenceChangeListener() {
                    public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
                        if (key.equals(KEY_PREF_LANGUAGE)) {
                            languagePref_ID = prefs.getString(SettingsActivity.KEY_PREF_LANGUAGE, "en");
                            switch (languagePref_ID) {
                                case "en":
                                    Locale localeEN = new Locale("en");
                                    setLocaleOnCreate(localeEN);
                                    break;
                                case "it":
                                    Locale localeIT = new Locale("it");
                                    setLocaleOnCreate(localeIT);
                                    break;
                            }
                        }
                    }
                };

        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.pref_general);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        bindPreferenceSummaryToValue(findPreference("name"));

        preferences.registerOnSharedPreferenceChangeListener(listener);
        addPreferencesFromResource(R.xml.pref_general);
    }

    @SuppressWarnings("deprecation")
    @Override
    protected void onResume() {
        super.onResume();
        getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
    }

    @SuppressWarnings("deprecation")
    @Override
    protected void onPause() {
        super.onPause();
        getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
    }

    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        if (key.equals(KEY_PREF_LANGUAGE)) {
            languagePref_ID = sharedPreferences.getString(SettingsActivity.KEY_PREF_LANGUAGE, "en");
            switch (languagePref_ID) {
                case "en":
                    Locale localeEN = new Locale("en");
                    setLocale(localeEN);
                    break;
                case "it":
                    Locale localeIT = new Locale("it");
                    setLocale(localeIT);
                    break;
            }
        }
    }

    public void setLocale(Locale locale) {
        Locale.setDefault(locale);

        Resources res = getResources();
        DisplayMetrics dm = res.getDisplayMetrics();
        Configuration conf = res.getConfiguration();

        conf.locale = locale;
        res.updateConfiguration(conf, dm);

        Intent intent = getIntent();
        finish();
        startActivity(intent);
    }

    public void setLocaleOnCreate(Locale locale) {
        Locale.setDefault(locale);

        Resources res = getResources();
        DisplayMetrics dm = res.getDisplayMetrics();
        Configuration conf = res.getConfiguration();

        conf.locale = locale;
        res.updateConfiguration(conf, dm);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                NavUtils.navigateUpFromSameTask(this);
                return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

Может кто-нибудь помочь мне в этой проблеме?

1 Ответ

0 голосов
/ 30 апреля 2018

В вашем методе onCreate вы вызываете метод addPreferencesFromResource дважды в первой и последней строке следующего кода.

addPreferencesFromResource(R.xml.pref_general);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

bindPreferenceSummaryToValue(findPreference("name"));

preferences.registerOnSharedPreferenceChangeListener(listener);
addPreferencesFromResource(R.xml.pref_general);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...