У меня есть действие, которое создает фрагмент программно.
фрагмент имеет внутри другой фрагмент.
активность содержит фрагмент А.
фрагмент А содержит фрагмент Б.
все работает отлично,
кроме случаев, когда я изменяю ориентацию экрана.
при изменении ориентации экрана фрагмент дублируется.
Я искал решения моей проблемы в Интернете (здесь тоже),
Я покрыл официальную документацию Android,
Я пытался сделать мои тесты:
но я не вернулся, чтобы найти решение!
Я видел других людей, которые решили, поместив код для создания фрагмента, если:
if (saveInstanceState == null) {
}
но у меня это не работает!
если я помещу код для создания фрагмента внутри него, фрагмент не создается.
Я попытался определить жизненный цикл действия с помощью отладки.
когда приложение создается впервые, приложение проходит здесь:
- активность
- фрагмент, onattach
- фрагмент, создаваемый
- фрагмент, oncreateview
когда я поворачиваю экран по горизонтали, приложение проходит здесь:
- фрагмент, onattach
- фрагмент, создаваемый
- активность
- фрагмент, oncreateview
- фрагмент, onattach
- фрагмент, создаваемый
- фрагмент, oncreateview
активность:
public class Activity extends AppCompatActivity {
ScrollView sv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity);
LinearLayout ll = (LinearLayout) findViewById(R.id.ll);
sv = findViewById(R.id.sv);
LinearLayout ll_fragment = new LinearLayout(this);
ll_fragment.setId(100);
ll_fragment.setOrientation(LinearLayout.VERTICAL);
LinearLayout.LayoutParams LLParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
ll_fragment.setLayoutParams(LLParams);
ll.addView(ll_fragment);
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
ArrayList<Integer> AL_Int = new ArrayList<Integer>();
AL_Int.add(sv.getId());
fragment = FragmentA.newInstance(AL_Int);
fragmentTransaction.add(ll_fragment.getId(), fragment);
fragmentTransaction.commit();
}
фрагмент:
public class FragmentA extends Fragment {
public static FragmentA newInstance(ArrayList<Integer> AL_Int_sv_ID) {
FragmentA f = new FragmentA();
Bundle b = new Bundle();
if(AL_Int_sv_ID.get(0) != null){
b.putInt("int_sv_ID", AL_Int_sv_ID.get(0));
b.putBoolean("bool_sv", true);
}else{
b.putInt("int_sv_ID", -1);
b.putBoolean("bool_sv", false);
}
f.setArguments(b);
return f;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle args = getArguments();
if (args != null) {
int int_ScrollView_ID = args.getInt("int_sv_ID");
boolean bool_ScrollView = args.getBoolean("bool_sv");
bool_sv = bool_ScrollView;
int_sv_ID = int_ScrollView_ID;
if(bool_sv){
sv = getActivity().findViewById(int_ScrollView_ID);
sv = FA.findViewById(int_ScrollView_ID);
}
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
LinearLayout ll = new LinearLayout(getActivity());
ll.setOrientation(LinearLayout.VERTICAL);
LLParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
ll.setLayoutParams(LLParams);
ll.setId(20);
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
FragmentB fragmentB = new FragmentB();
transaction.add(20, fragmentB);
transaction.commit();
return ll;
}