Окей, поэтому сначала у меня есть активность
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 впереди