Новые настройки не загружаются при нажатии кнопки «Назад» - PullRequest
3 голосов
/ 03 июля 2011

У меня есть этот класс настроек (ниже), который сохраняет две ListPreferences, но если ListPreferences изменились и была нажата кнопка «Назад», изменения не вступят в силу, пока приложение не будет перезапущено.Я что-то пропустил?Искал везде, но просто не могу найти ответ, подходит или работает.Пожалуйста, помогите.

    public class Preferences extends PreferenceActivity {

      @Override
      public void onCreate(Bundle savedInstanceState){
           super.onCreate(savedInstanceState);
           addPreferencesFromResource(R.xml.preferences);
           }

      @Override
      public void onPause() {
           super.onPause();
           }

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

Код заявки

 public class Quotes extends Activity implements OnClickListener {

 ProgressDialog dialog;
 private WebView webview;

 @Override
 public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);

      SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(getBaseContext());

      String q = SP.getString("appViewType","http://www.google.com");
      String c = SP.getString("appRefreshRate","20");

      webview = (WebView) findViewById(R.id.scroll);
      webview.getSettings().setJavaScriptEnabled(true);
      webview.setWebViewClient(new QuotesWebView(this));
      webview.loadUrl(q);

      ScheduledExecutorService timer = Executors.newSingleThreadScheduledExecutor();
      timer.scheduleAtFixedRate(new Runnable() {

      @Override
      public void run() {
           webview.reload();
           }

      }, 10, Long.parseLong(c),TimeUnit.SECONDS);

      findViewById(R.id.refresh).setOnClickListener(this);
 }

      @Override
      public void onPause(){
           super.onPause();
           }

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

      public void onClick(View v){
           switch(v.getId()){
                case R.id.refresh:
                webview.reload();
           break;
      }
 }


 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
      MenuInflater inflater = getMenuInflater();
      inflater.inflate(R.menu.menu, menu);

      MenuItem about = menu.getItem(0);
      about.setIntent(new Intent(this, About.class));

      MenuItem preferences = menu.getItem(1);
      preferences.setIntent(new Intent(this, Preferences.class));

      return true;

      }

 }   

Ответы [ 6 ]

2 голосов
/ 29 января 2017

Попробуйте переопределить метод onBackPressed ().

Если ваша кнопка «Вверх» (вверху слева <-) дает правильный результат, то вы можете настроить кнопку «Назад» так, чтобы она работала как кнопка «Вверх». </p>

@Override
public void onBackPressed() {
    super.onBackPressed();
    NavUtils.navigateUpFromSameTask(this);
}
2 голосов
/ 03 июля 2011

Вам нужно каким-то образом перезагрузить ваши предпочтения, когда действие предпочтений закончится.Я думал, что предложение Дирола о загрузке их в onResume () вместо onCreate () было превосходным;Ты это пробовал?Или я также неправильно понимаю проблему.

В моем собственном случае я запустил действие предпочтений с помощью startActivityForResult (), а затем при обратном вызове результата действия я перезагрузил предпочтения.

Фрагменты кода:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
      case MENU_PREFERENCES:
        Intent intent = new Intent().setClass(this, CalcPreferences.class);
        startActivityForResult(intent, MENU_PREFERENCES);
        break;
      default: return super.onOptionsItemSelected(item);
    }
    return true;
}

@Override
protected void onActivityResult(int req, int result, Intent data) {
    switch( req ) {
      case MENU_PREFERENCES:
        SharedPreferences sp =
          PreferenceManager.getDefaultSharedPreferences(this);
        updatePreferences(sp);
        break;
      default:
        super.onActivityResult(req, result, data);
        break;
    }
}

@Override
protected void updatePreferences(SharedPreferences sp) {
    super.updatePreferences(sp);
    keyclick = sp.getBoolean("keyclick", keyclick);
}

В любом случае, это то, что работает для меня.Я могу попробовать переместить вызов updatePreferences () в onResume () самостоятельно, чтобы проверить, работает ли он тоже.

1 голос
/ 16 мая 2012

У меня была такая же проблема, и я решил ее следующим образом:

Основной класс действий реализует OnSharedPreferenceChangeListener:

public class Activity_name extends Activity implements OnSharedPreferenceChangeListener  {
    ...
}

Внутри основного класса действий onSharedPreferenceChanged запускается всякий раз, когда изменяется запись предпочтения. Я просто обновляю все свои переменные из настроек, как я это делал в onCreate:

@Override
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
    <read all preferences as you did in onCreate()>
}

Это помогает, и я надеюсь, что это сэкономит вам время на поиск решения.

1 голос
/ 03 июля 2011

Вы загружаете настройки только по методу onCreate ().Этот метод вызывается только при запуске новой активности.AddPreferencesFromResource раздувает xml-файл в настройках, поэтому вы получаете только ту информацию, которая уже была сохранена в xml на момент вызова addPreferencesFromResource, а не после.

Попробуйте переместить этот метод в onResume.Но следите за утечкой памяти.Я не знаю точно, что делает addPreferencesFromResource, но из документации - я бы очень подозрительно относился к активности этого метода.

0 голосов
/ 17 августа 2015

Вам потребуется перезагрузить представление или любой другой объект, который использует эти предпочтения, предпочтительно, когда действие предпочтений закрывается.

Действия предпочтения не изменяют ничего, кроме внутреннего файла с вашими предпочтениями (ключ = список значений).Когда это изменяется, preferenceActivity вызывает onPreferenceChaged() и ничего более.Он не обновляет ваши вещи сам по себе.Вам необходимо перезагрузить префы и использовать их в методе onResume() или аналогичном.

0 голосов
/ 16 мая 2012

У меня была такая же проблема ... Попробуйте создать экземпляр предпочтения и загрузить его данные в каждый класс и каждое действие, где вам это нужно.У меня это сработало ... Надеюсь, это поможет.

...