Только Switch.setChecked не работает, когда фрагмент показан? - PullRequest
0 голосов
/ 06 марта 2020

Окей, поэтому сначала у меня есть активность

public class MainActivity extends FragmentActivity
{
    private FragmentA a;
    private FragmentB b;
    private FragmentC c;
    private HomeFragment mHomeFragment;


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.home_activity_layout);
     FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.fragment_container, mHomeFragment) // replace flContainer
                .addToBackStack(null)
                .commit();

    ...
    }

Я использую ленивый инициализатор и сохраняю свой объект a, b, c и mHomeFragment внутри моего объекта активности,

У меня есть кнопка внутри 'b', которая вызывает MainActivity для вызова 'c', и кнопка внутри 'c', которая вызывает MainActivity для вызова 'b'

и некоторые другие кнопки для вызова 'a', который не так важен

Ну, теперь внутри моего FragmentB у меня есть несколько пользовательских представлений,

  public CustomView(Context cnx, SettingsViewElement e, FragmentA fragment)
    {
    super(cnx);
    inflate(cnx, R.layout.my_layout,this);
    parent = fragment; // i use it later in my onCheckedChangeListener to tell him the the switch has been checked 
    condition = parent.getCondition();

    titleTv = this.findViewById(R.id.title_tv);
    switch  = this.findViewById(R.id.switch);
    if(condition){
    switch.setChecked(true);
    titleTv.setTitle("i am depressed af :(");

    }



мой вопрос:

почему мой переключатель не включается, даже если мой titleTv обновляет заголовок ??

Я провел несколько тестов, и мой OnCreated () вызывается каждый раз, когда я вызываю replace () в моей транзакции фрагмента.

мой фрагмент повторно создает экземпляры представлений и затем добавляет их в linearLayout после раздувания макета.

Кроме того, если я не сохраню ссылку на мои фрагменты в моей MainActivity, а затем повторно создаю экземпляр это каждый раз. здесь: switch.setChecked будет работать , но backStack будет огромным и тупым

пример: stack = 'b' -> 'c' -> 'b' -> 'c 'Обычно, когда пользователь дважды нажимает кнопку возврата, он возвращается в homeFragment, ему не нужно очищать стек самостоятельно.

и даже если я переопределю @onBackPressed () и заново создаю экземпляры фрагментов каждый раз, надеясь, что android sdk освободит место.

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

и: ЭТО НЕ ОБЪЯСНЯЕТ ПОЧЕМУ Switch.setChecked () не работает, даже если условие истинно, а другие представления обновляются (textView обновляет свой текст)

Обновление: очевидно,

, если фрагмент используется повторно и onCreate () вызывается во второй раз (ссылка на фрагмент хранится где-то, а фрагмент присоединяется во второй раз) здесь setChecked не будет действовать, только некоторые другие обновления представлений

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

Решение: обновить представления в методе OnResume ()

Если у кого-то есть объяснение Пожалуйста, go впереди

Ответы [ 2 ]

0 голосов
/ 06 марта 2020

Обновление: очевидно,

, если фрагмент используется повторно и onCreate () вызывается во второй раз (ссылка на фрагмент хранится где-то, а фрагмент прикрепляется для время второго сеанса) здесь setChecked не будет действовать, обновятся только некоторые другие представления

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

Решение: обновление представлений в методе OnResume ()

Если у кого-то есть объяснение этому, пожалуйста, go вперед

0 голосов
/ 06 марта 2020

Представления сохраняют и восстанавливают (некоторые) их состояния в течение цикла saveInstanceState / restoreInstance, но, к сожалению, проверенное состояние (а также видимость и т. Д. c) этим не охватываются. Таким образом, вы будете реализовывать onSaveInstanceState et c. для своего фрагмента и сохраните / восстановите проверенное состояние самостоятельно.

РЕДАКТИРОВАТЬ

Из вашего вопроса неясно, что на самом деле представляет собой switch, поэтому я не могу дать вам актуальный код. Но взгляните на реализацию CheckedTextView и ознакомьтесь с реализацией onSaveInstanceState() и onRestoreInstanceState(). Вы увидите, что они сохраняют и восстанавливают проверенное состояние (это довольно много кода с классом SavedState, но в конце это довольно просто). Что вам нужно сделать, это реализовать эти два метода для вашего пользовательского представления (также создавая собственный внутренний класс SavedState) и сохранить / восстановить проверенное состояние вашего представления переключателя.

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

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