После изменения ориентации экрана фрагмент дублируется - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть действие, которое создает фрагмент программно. фрагмент имеет внутри другой фрагмент.

активность содержит фрагмент А. фрагмент А содержит фрагмент Б.

все работает отлично, кроме случаев, когда я изменяю ориентацию экрана.

при изменении ориентации экрана фрагмент дублируется.

Я искал решения моей проблемы в Интернете (здесь тоже), Я покрыл официальную документацию 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;

}

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

была такая же проблема, попробуйте фрагментTransaction.replace () вместо fragmentTransaction.add ()

0 голосов
/ 01 ноября 2018

Вам нужно повторить попытку метода if (saveInstanceState == null). Это правильный способ справиться с этим, возможно, вы делаете что-то не так, оберните только эти 3 строки в if:

fragment = AutoCompleteTextView_Fragment.newInstance(AL_Int); 
fragmentTransaction.add(ll_fragment.getId(), fragment); 
fragmentTransaction.commit();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...