Вам необходимо предоставить вашему фрагменту уникальный тег и проверить, уже ли этот фрагмент уже добавлен в вашу деятельность или нет.
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
String tag = "my_fragment";
FragmentManager fragmentManager = getFragmentManager();
if(fragmentManager.findFragmentByTag(tag) == null) {
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
Fragment homeFragment = new Home();
fragmentTransaction.add(R.id.mainFragement, homeFragment, tag);
fragmentTransaction.commit();
}
}
Проверка ли savedInstanceState
является недействительным не является безопасным способом проверить, является ли ваш фрагмент уже установлен - он будет работать в большинстве случаев, но в некоторых случаях (например, когда устройство находится на низкой памяти), Android может убить вашу активность, что может сломать ваше приложение.
Чтобы увидеть это в действии, поставьте галочку «Не держите действия» в настройках разработки устройства (параметр доступен в Android 4.0+, не уверен в более ранних версиях). Когда вы открываете новое действие, ваше первое действие уничтожается. Когда вы вернетесь к нему (нажав назад), он будет создан снова, а savedInstanceState будет не null. Однако ваш фрагмент больше не работает, и вы должны добавить его снова.
EDIT - Показаны исходный принцип, но с SupportFragmentManager
public class ActivityAwesome extends AppCompatActivity
{
private final String TAG = getClass().getSimpleName();
private FragmentHome mHomeFragment;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_layout);
FragmentManager fragmentManager = getSupportFragmentManager();
Fragment fragment = fragmentManager.findFragmentByTag(TAG);
if(fragment == null)
{
// Create the detail fragment and add it to the activity using a fragment transaction.
mHomeFragment = new FragmentHome();
fragmentManager.beginTransaction()
.add(R.id.fragment_container, mHomeFragment, TAG)
.commit();
}
else
{
// get our old fragment back !
mHomeFragment = (FragmentHome)fragment;
}
}
}
это происходит в особенно полезно, если вы хотите, чтобы манипулировать фрагмент (в данном случае mHomeFragment
) после поворота устройства
, что я должен делать в случае, если я использую активность с ViewPager, которая обрабатывает фрагменты? –
@androiddeveloper молиться. Серьезно, что я сделал: super.onCreate (null); – Warpzit
«По умолчанию андроид сохранит объекты фрагмента» ... не верно. Android создаст новые объекты при изменении ориентации, если не вызвано 'setRetainInstance (true)'. Не путайте это с автоматической перезагрузкой фрагментов Android. Это не одно и то же. Проверьте следы, сообщенные S.D. на [этот ответ] (http://stackoverflow.com/a/12641575/2619107). – Rafa