Фрагмент загружается несколько раз при изменении ориентации - PullRequest
0 голосов
/ 13 апреля 2020

Когда я меняю ориентацию на эмуляторе или телефоне, фрагмент загружается еще один раз. Если бы я повернул устройство 3 раза, фрагмент загрузился бы три раза после последнего вращения, если бы я повернул устройство 5 раз, оно загрузилось бы 5 раз после последнего вращения.

Основная активность

...
FragmentOne fragment = new FragmentOne();

FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.add(R.id.main_container, fragmnet);
transaction.commit();

Единственное, что у меня есть во фрагменте, - это журналы, которые не должны вызывать загрузку фрагмента несколько раз. FragmentOne

 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        Log.d(TAG, "onCreateView: ");
        return inflater.inflate(R.layout.fragment_fragment_one, container, false);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        Log.d(TAG, "onViewCreated: ");
    }

Вот копия журнала после одного поворота, уведомление onCreateView вызывается несколько раз с одним изменением ориентации.

2020-04-13 01:23:07.396 10857-10857/com.example.myapplication D/MYFragmentOne: onCreate: 
2020-04-13 01:23:07.396 10857-10857/com.example.myapplication D/MYFragmentOne: onCreate: 
2020-04-13 01:23:07.418 10857-10857/com.example.myapplication D/MYMainActivity: onCreate: 
2020-04-13 01:23:07.423 10857-10857/com.example.myapplication D/MYFragmentOne: onCreateView: 
2020-04-13 01:23:07.429 10857-10857/com.example.myapplication D/MYFragmentOne: onViewCreated: 
2020-04-13 01:23:07.429 10857-10857/com.example.myapplication D/MYFragmentOne: onCreateView: 
2020-04-13 01:23:07.431 10857-10857/com.example.myapplication D/MYFragmentOne: onViewCreated: 
2020-04-13 01:23:07.431 10857-10857/com.example.myapplication D/MYFragmentOne: onCreate: 
2020-04-13 01:23:07.431 10857-10857/com.example.myapplication D/MYFragmentOne: onCreateView: 
2020-04-13 01:23:07.433 10857-10857/com.example.myapplication D/MYFragmentOne: onViewCreated:



App details
compileSdkVersion 29
buildToolsVersion "29.0.2"
applicationId "com.example.myapplication"
minSdkVersion 29
targetSdkVersion 29

Что заставило бы фрагмент загружаться столько раз с изменением ориентации?

Вот ссылка на мой github Ссылка

Ответы [ 2 ]

2 голосов
/ 13 апреля 2020

Когда ориентация деятельности меняется, она снова вызывает onCreate(), и фрагмент, который вы в нее вставили, также будет воссоздан. В этом случае вы должны создавать фрагмент только при первой загрузке действия. Затем получите экземпляр сохраненного фрагмента при следующей загрузке. Используйте tag в качестве клавиши Fragment.

private static final String FRAGMENT_TAG = "fragmentOne";

private Fragment fragment;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_settings)

    // savedInstanceState always null on activity's first load
    if (savedInstanceState == null) {
        fragment = new FragmentOne();
    } else {
        fragment = getSupportFragmentManager().findFragmentByTag(FRAGMENT_TAG);
    }

    getSupportFragmentManager().beginTransaction()
        .replace(R.id.main_container, fragment, FRAGMENT_TAG)
        .commit();
}
1 голос
/ 13 апреля 2020

Это происходит потому, что это "нормальное" поведение жизненного цикла android. Когда вы поворачиваете свой телефон / экран, происходит изменение ориентации, результатом которой является воссоздание активности. Есть несколько решений: во-первых, отключение ориентации в файле манифеста, но это, вероятно, не то решение, которое вы ищете! Второй - проверка, если фрагмент уже добавлен. Вы можете сделать что-то вроде:

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MYMainActivity";
    private FragmentOne fragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d(TAG, "onCreate: ");
        if (fragment == null) {
        fragment = new FragmentOne();

        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();


        transaction.add(R.id.main_container, fragment);
        transaction.commit();
        }
    }
}

В этом случае вы не будете добавлять несколько фрагментов каждый раз при повторном создании действия. Более того, вы можете проверить из диспетчера фрагментов, если фрагмент уже добавлен из TAG, просто добавьте id в функцию транзакции.add и проверьте его, если он существует!

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

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