Как правильно обрабатывать привязку TextView, чтобы включить изменение ориентации во фрагменте - PullRequest
0 голосов
/ 23 января 2019

Как следует из названия, как избежать потери текста TextView после изменения ориентации?
Обратите внимание, как TextView связан с Switch: исходным текстом (определенным в XML)имеет значение OFF (поскольку Switch изначально находится в выключенном состоянии), и при каждом изменении состояния Switch текст TextView изменяется соответствующим образом.

Ожидаемое поведение:

  1. Открыть приложение: Switch выключено, TextView выключено ВЫКЛ
  2. Включить Switch: TextView is ON
  3. Поверните устройство: Switch остается включенным и TextView остается ON , а также

Фактическое поведение:

  1. Открытое приложение: Switch выключено, TextView является ВЫКЛ
  2. Включите Switch: TextView is ON
  3. Поверните устройство: Switch остается включенным, но TextView is OFF

Произойдет следующеепотому что Fragment перерисовывается и так как OnCheckedChangeListener вызывается при каждом изменении ориентации (Мой вопрос: SwitchCompat OnCheckedChangeListener вызывается при каждом изменении ориентации фрагмента ), но обработка происходит только в том случае, если Switch был фактически нажат (чтобы избежать проблемы в вопросе выше), TextView рисуется с текстом по умолчанию в XML,

Поведение без isPressed ():

  1. Открытое приложение: Switch выключено, TextView равно ВЫКЛ
  2. Включите Switch: TextView is ON
  3. Поверните устройство: Switch "остается" и TextView "остается" ON также НО OnCheckedChangeListener вызывается снова, и я хочу избежать этого, потому что я хочу, чтобы звонок туда ТОЛЬКО , если пользователь фактически переключил Switch

MainFragment.java:

public class MainFragment extends Fragment implements CompoundButton.OnCheckedChangeListener {

    private AppCompatTextView appCompatTextView;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        final View rootView = inflater.inflate(R.layout.main_fragment, container, false);
        appCompatTextView = rootView.findViewById(R.id.app_compat_textview);
        final SwitchMaterial switchMaterial = rootView.findViewById(R.id.switch_material);
        switchMaterial.setOnCheckedChangeListener(this);
        return rootView;
    }

    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (buttonView.isPressed()) {
            if (isChecked) {
                appCompatTextView.setText("ON");
            } else {
                appCompatTextView.setText("OFF");
            }
        }
    }
}

1 Ответ

0 голосов
/ 23 января 2019

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

...