Обработка изменений поворота экрана в Android?

#android #runtime #state #landscape #handle

#Android #время выполнения #состояние #пейзаж #обрабатывать

Вопрос:

Моя проблема в том, что я не могу обрабатывать операции в портретном и ландшафтном режимах. На экране у меня есть одна форма регистрации, но она находится в отключенном состоянии. Когда я нажму кнопку регистрации, которая появится. Итак, когда я перейду в альбомную ориентацию, если я поверну экран, что снова появится в исчезнувшем портрете. Поэтому, пожалуйста, дайте несколько советов, как я могу с этим справиться.

код:

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

    context = this;
    insertAnalasysMethodVlaues();
    insertEquipmentTypeValues();
    initUI();
    showEquipmentTypeSpinner();
    showAnalasisTypeSpinner();

    equipmentTable = new EquipmentTable(context);
    listequipment = equipmentTable.selectAllRecords();

    showRecords(listequipment);

    equipment_add.setOnClickListener(this);
    equipment_search.setOnClickListener(this);
    search.setOnClickListener(this);
    insert.setOnClickListener(this);
    cancel.setOnClickListener(this);
    equipmentmanagement_text.setOnClickListener(this);
    equipment_loadall.setOnClickListener(this);
    equipment_type_spinner.setOnItemSelectedListener(this);
    analysis_method_spinner.setOnItemSelectedListener(this);
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
}
  

Комментарии:

1. Примечание: не используйте onConfigurationChanged() без необходимости.

2. Если вы хотите установить ориентацию экрана, чем в вашем манифесте, установите это ….. <activity android:name=»YourActivity» android:screenOrientation=»portrait»> </ activity> и ваша проблема может быть решена

Ответ №1:

Что вам нужно сделать, это сохранить, если логин отображается пользователю. Один из способов сделать это — переопределить onSaveInstanceState() и добавить информацию в Bundle :

 @Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    outState.putBoolean("login_visible", isLoginVisible);
}
  

А затем в onCreate вы можете получить значение из savedInstanceState следующего:

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

    ...

    if(savedInstanceState != null) { 
        boolean isLoginVisible = savedInstanceState.getBoolean("login_visible");
        if(isLoginVisible) {
            // Set the visibility of the login back to View.VISIBLE!
        }
    }               
}
  

Комментарии:

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

2. Да, конечно. Activity Воссоздается при изменении конфигурации. Это совершенно нормально. Решение в моем ответе специально предназначено для решения этой проблемы. Вы можете добавить всю информацию, которую хотите сохранить, в Bundle in onSaveInstanceState() и снова прочитать ее из Bundle in onCreate() . То, что вы добавляете Bundle , сохраняется независимо от того, сколько раз Activity оно воссоздается.

Ответ №2:

Вы можете использовать некоторые значения флага integer/boolean , чтобы сохранить состояния формы. и в protected void onCreate(Bundle savedInstanceState) {} привязке представления в соответствии с состоянием формы. т. Е. Вы можете отображать кнопку «Отключено / включено» в зависимости от состояния формы.

Ответ №3:

 boolean isSearch = false,isModification = false;

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

    if(savedInstanceState != null) 
    { 
        boolean isSearch = savedInstanceState.getBoolean("search_visible");
        boolean isModification = savedInstanceState.getBoolean("modification_visible");

        if(isSearch) 
        {
            searchEquipmentDetails();
        }
        else if(isModification)
        {
            showEquipmentModificationDetails();
        }
        else
        {
            loadall();
        }
    }

    context = this;
    insertAnalasysMethodVlaues();
    insertEquipmentTypeValues();

    showEquipmentTypeSpinner();
    showAnalasisTypeSpinner();

    equipmentTable = new EquipmentTable(context);
    listequipment = equipmentTable.selectAllRecords();

    showRecords(listequipment);

    equipment_add.setOnClickListener(this);
    equipment_search.setOnClickListener(this);
    search.setOnClickListener(this);
    insert.setOnClickListener(this);
    cancel.setOnClickListener(this);
    equipmentmanagement_text.setOnClickListener(this);
    equipment_loadall.setOnClickListener(this);
    equipment_type_spinner.setOnItemSelectedListener(this);
    analysis_method_spinner.setOnItemSelectedListener(this);
}
  

это код для записи в create для сравнения состояния

 @Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putBoolean("search_visible", isSearch);
    outState.putBoolean("modification_visible", isModification);
}
  

Вы должны указать состояние проекта.

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

  private void searchEquipmentDetails() 
{
    isSearch = true;
    isModification = false;

    equipment_details.setVisibility(View.GONE);
    equipment_modifications.setVisibility(View.GONE);
    equipment_details_search.setVisibility(View.VISIBLE);

    equipment_search_edittext.setText("");
}


 private void showEquipmentModificationDetails()
{
    isSearch = false;
    isModification = true;

    equipment_details.setVisibility(View.GONE);
    equipment_modifications.setVisibility(View.VISIBLE);
    equipment_details_search.setVisibility(View.GONE);

    equipment_name_edittext.setText("");
    equipment_id_edittext.setText("");

    insert.setText("Insert");
    b = true;
}
  

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