вращающийся экран Android вызывает изменение цвета текста по умолчанию - PullRequest
0 голосов
/ 03 июня 2018

В моем приложении для Android, где я создаю игру в крестики-нолики, у меня есть этот код ниже, где, если это игрок одним ходом, тогда установите их выбор как X с определенным цветом, иначе это должен быть игрок2 поэтому установите текст как O для их выделения другим цветом.

@Override
public void onClick(View v) {
    if (!((Button) v).getText().toString().equals("")) {
        return;
    }

    if (playerOneMove) {
        ((Button) v).setText("X");
        ((Button) v).setTextColor(Color.parseColor("#e8e5e5"));
    } else {
        ((Button) v).setText("O");
        ((Button) v).setTextColor(Color.parseColor("#737374"));
    } 

    ...

}

У меня проблема, хотя, и это касается того, когда я поворачиваю экран.Когда я поворачиваю экран, текст для X и O меняется на цвет текста по умолчанию, который предоставляет Android Studio.Я хочу сохранить цвета для этого текста, но я не уверен, как это сделать?Я убедился, что глобальный цвет текста не задан.

Ниже приведен мой код, который обрабатывает изменения ориентации:

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putBoolean("playerOneMove", playerOneMove);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    playerOneMove = savedInstanceState.getBoolean("playerOneMove");
}

1 Ответ

0 голосов
/ 03 июня 2018

Вам необходимо сохранить цвета каждой коробки вашей крестики-нолики и снова сохранить их при изменениях конфигурации макета (например, при повороте устройства).

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

Основная идея заключается в том, чтобы сохранить статические макеты в переменных, которые сохранятся после изменений конфигурации, и соответственно обновить их в вашей функции onCreate или onCreateView в случае Activity и Fragment соответственно.Однако в вашем случае вам нужно хранить много данных, и при каждом изменении конфигурации вам нужно восстанавливать их снова, что не является эффективным способом сделать это.Я хотел бы порекомендовать вам поискать другие доступные варианты, которые сохраняют ориентацию или изменения конфигурации вашего макета.

Я бы настоятельно рекомендовал реализовать ViewModel в вашем случае, который выдерживает изменение конфигурации приложения и обрабатывает общее представление пользовательского интерфейса наиболее эффективным способом.Идея состоит в том, чтобы связать ваши элементы пользовательского интерфейса с ViewModel, а затем каждый раз сохранять элементы пользовательского интерфейса из вашего ViewModel.Его можно сохранить в точном состоянии до тех пор, пока не закончится Activity или Fragment.

В вашем случае я хотел бы привести пример того, как вы можете подготовить ViewModel.Давайте рассмотрим ваш ViewModel GameModel, который сохраняет элементы макета вашей доски.

public class GameModel extends ViewModel {
     public final LiveData<Game> gameLiveData = new LiveData<>();

     public GameModel() {
         // trigger game load.
     }

     void doAction() {
         // depending on the action, do necessary business logic calls and update the gameLiveData.
     }
}

public class Game {
    public static final int CROSS = 1; 
    public static final int ZERO = 0;

    public int pos1 = -1; // Default values are -1, when the position is yet to be played
    public int pos2 = -1;
    public int pos3 = -1;
    public int pos4 = -1;
    public int pos5 = -1;
    public int pos6 = -1;
    public int pos7 = -1;
    public int pos8 = -1;
    public int pos9 = -1;
}

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

public class UserActivity extends Activity {

     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.game_activity_layout);
         final GameModel viewModel = ViewModelProviders.of(this).get(GameModel.class);
         viewModel.gameLiveData.observer(this, new Observer() {
            @Override
             public void onChanged(@Nullable Game gameData) {
                 // update ui.
             }
         });
         findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                  // Pass parameters in doAction function to set the items in the Game class and update the ui accordingly inside the onChanged function.
                  viewModel.doAction(); 
             }
         });
     }
}

Надеюсь, это поможет!

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