Разрешение, если тема изменена для действия - PullRequest
2 голосов
/ 02 декабря 2010

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

Есть несколько действий, которые используют темы. И есть еще один, который расширяет PreferenceActivity и предоставляет функциональность для выбора темы. Идентификатор выбранной темы сохраняется в общих настройках. Когда некоторые действия, использующие темы, получают onResume(), я хочу проверить, совпадает ли текущий идентификатор темы с тем, который сохранен в общих настройках. Но у Theme объекта нет идентификатора или метода для его идентификации.

ОБНОВЛЕНИЕ: Теперь я рассматриваю возможность иметь строковое имя текущей темы в каждом действии, но это решение выглядит довольно уродливо, потому что мне нужно было бы добавить одну и ту же переменную для каждого действия в приложении.

Как правильно выполнить эту проверку? Я что-то не так делаю?

Ответы [ 2 ]

0 голосов
/ 14 сентября 2012

Это может быть то, что вы хотите.Я использую флаг, чтобы после того, как я установил тему в операции настройки и вернулся к этой операции вызова, то операция вызова будет перезапущена, и теме будет присвоено некоторое значение в SharedPreferences.

private boolean activityStarted = false;

public void onCreate(Bundle savedInstanceState) {
  Log.d(DEBUG_TAG, "onCreate()");
  activityStarted = true;
  setTheme();  // user-defined method

  super.onCreate(savedInstanceState);
  ...
}


@Override
protected void onResume() {
  super.onResume();
  Log.d(DEBUG_TAG, "onResume()");

  if(activityStarted == true){ // it has come from onCreate()
    activityStarted = false; // Set flag to false so that next time onResume() 
                             // is called after resuming existing activity, 
                             // the activity will be restarted and theme will
                             // be set
  } else { // it has directly come to onResume()
    finish();
    startActivity(getIntent());
  }

}
* 1004.* Обновление

Я не уверен, что это лучший способ сделать это, но вместо того, чтобы вводить логику в метод onResume(), я переопределяю метод onActivityResult() и перезапускаю Activity, еслипредыдущий Activity был Настройки Activity.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == R.id.settings) {
        Intent settings_intent = new Intent(this, Settings.class); 
        startActivityForResult(settings_intent, SETTINGS);  
        return true;
    } else {
        return super.onOptionsItemSelected(item);
    }
}

@Override
public void onActivityResult(int reqCode, int resultCode, Intent data) {
    super.onActivityResult(reqCode, resultCode, data);

    // Identify our request code
    switch (reqCode) {
        case SETTINGS:
            if (resultCode == RESULT_CANCELED) {
                Log.d(DEBUG_TAG, "RESULT_CANCELED");
                finish();
                startActivity(getIntent());
            } else if (resultCode == RESULT_OK) {
                Log.d(DEBUG_TAG, "RESULT_OK");
            }

            break;
    }

}
0 голосов
/ 07 декабря 2010

Я видел приложения, которые требуют, чтобы вы перезапустили приложение, чтобы изменения темы вступили в силу.Я не думаю, что это проблема.Таким образом, вы можете просто применить тему при запуске и больше не беспокоиться об этом.

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