registerOnSharedPreferenceChangeListener не работает - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь обновить цвет фона моего приложения, изменив настройки, но метод onSharedPreferenceChanged так и не был достигнут. Настройки успешно изменены, но слушатель не работает должным образом:

MainActivity:

public class MainActivity extends AppCompatActivity implements SharedPreferences.OnSharedPreferenceChangeListener {

private RecyclerView mRecyclerView;
private ContactsAdapter mAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Toolbar myToolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(myToolbar);

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

}

@Override
public void onResume() {
    super.onResume();

    SharedPreferences mSettings = PreferenceManager.getDefaultSharedPreferences(this);
    mSettings.registerOnSharedPreferenceChangeListener(this);
}

@Override
protected void onPause() {
    super.onPause();

    SharedPreferences mSettings = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
    mSettings.unregisterOnSharedPreferenceChangeListener(this);

}

@Override
public boolean onCreateOptionsMenu(Menu menu){
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_settings:
            Intent intent = new Intent(this, MyPreferenceActivity.class);
            startActivity(intent);
            return true;
        case R.id.action_favorite:
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}

@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {

    if(key.equals("color")) {
        String color = sharedPreferences.getString("color", "3");

        int colorId = Integer.valueOf(color);

        // Alterar background

        ViewGroup viewGroup = (ViewGroup) ((ViewGroup) (findViewById(android.R.id.content))).getChildAt(0);

        if (colorId == 1) {
            viewGroup.setBackgroundColor(Color.WHITE);
        } else if (colorId == 2) {
            viewGroup.setBackgroundColor(Color.YELLOW);
        } else if (colorId == 3) {
            viewGroup.setBackgroundColor(Color.RED);
        }

    }
 }
}

MyPreferenceActivity:

public class MyPreferenceActivity extends PreferenceActivity {

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

    addPreferencesFromResource(R.xml.preference);

}
}

Метод onSharedPreferenceChanged никогда не вызывается, единственный способ заставить его работать - реализовать метод OnSharedPreferenceChangeListener непосредственно внутри onResume, но иногда он работает нормально, иногда - нет, и метод не достигается.

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Shared preference registerOnSharedPreferenceChangeListener действителен только тогда, когда MainActivity находится на переднем плане, в противном случае он будет незарегистрирован в onPause.

0 голосов
/ 07 ноября 2018

Когда вы создаете PreferenceActivity с именем MyPreferenceActivity, вызывается onPause() из MainActivity, когда слушатель становится незарегистрированным.

Можно обойтись, отменить регистрацию у слушателя onStop() вместо onPause() в MainActivity.

MainActivity.java

@Override
public void onStart() {
    super.onStart();

    SharedPreferences mSettings = PreferenceManager.getDefaultSharedPreferences(this);
    mSettings.registerOnSharedPreferenceChangeListener(this);
}

@Override
protected void onStop() {
    super.onStop();

    SharedPreferences mSettings = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
    mSettings.unregisterOnSharedPreferenceChangeListener(this);

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...