Фрагмент находится в задней части

В моем приложении «Мой первый Fragment находится в BackStack, и этот фрагмент не был добавлен в стопку во время транзакций.

Редактировать.

Я использую один и тот же фрагмент много раз после первых перерывов, но перерезка с последующим первым добавляется в backstack с помощью addToBackStack(TAG); Но я никогда не добавлял первый фрагмент в backstack, но все же я не понимаю, почему я должен дважды щелкнуть, чтобы отправить приложение в фоновый режим.

Вот код этого

 FragmentManager fm = getSupportFragmentManager(); Bundle args = new Bundle(); args.putString("url", Constants.URL_BASE); feedFragment.setArguments(args); fm.beginTransaction().replace(R.id.content_frame, feedFragment).commit(); 

Теперь, когда я нажимаю кнопку «Назад», он удаляет фрагмент, но приложение не переходит в фоновый режим. Он переходит в фоновый режим, когда я снова нажимаю кнопку «Назад».

Сам replace() сам добавляет фрагмент в backstack? Если да, то как я могу удалить фрагмент и сделать свое приложение в фоновом режиме onBackPressed ? Если он не добавляет фрагмент в backstack, то почему это происходит? Как я должен заставить его работать правильно?

Спасибо!

Редактировать:

Здесь полный код активности.

 public class MainActivity extends AppCompatActivity { private final String TAG = getClass().getName(); private DrawerLayout drawerLayout; private FeedFragment feedFragment = new FeedFragment(); private ListView listView; private LinearLayout searchLayout; private RelativeLayout logolayout; private Toolbar toolbar; private Button settingBtn; private Button bookmarkBtn; private Button searchBtn; private Tracker mTracker; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ApplicationController applicationController = (ApplicationController) getApplication(); mTracker = applicationController.getDefault(); initToolbar(); initUi(); loadCategorgies(); initFeed(); } public void initUi() { drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); listView = (ListView) findViewById(R.id.lv_categories); settingBtn = (Button) findViewById(R.id.btn_settings); bookmarkBtn = (Button) findViewById(R.id.btn_bookmarks); searchBtn = (Button) findViewById(R.id.btn_search); settingBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager.beginTransaction().replace(R.id.content_frame, new SettingFragment()).addToBackStack("setting").commit(); drawerLayout.closeDrawers(); } }); bookmarkBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager.beginTransaction().replace(R.id.content_frame, new BookmarkFragment()).addToBackStack("bookmark").commit(); drawerLayout.closeDrawers(); } }); searchBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager.beginTransaction().replace(R.id.content_frame, new SearchFragment()).addToBackStack("search").commit(); drawerLayout.closeDrawers(); } }); } public void initToolbar() { toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_action_menu_inactive); getSupportActionBar().setDisplayHomeAsUpEnabled(true); } public void hideLogo() { ImageView imageView = (ImageView) toolbar.findViewById(R.id.logo); imageView.setVisibility(View.GONE); } public void showLogo() { ImageView imageView = (ImageView) toolbar.findViewById(R.id.logo); imageView.setVisibility(View.VISIBLE); } public void loadCategorgies() { StringRequest stringRequest = new StringRequest(Constants.URL_GET_CATEGORIES, new Response.Listener<String>() { @Override public void onResponse(String response) { if (Constants.isDev) Log.d(TAG, response); final CategoriesDTO categoriesDTO = Constants.gson.fromJson(response, CategoriesDTO.class); CatgoriesAdapter catgoriesAdapter = new CatgoriesAdapter(categoriesDTO, MainActivity.this); listView.setAdapter(catgoriesAdapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (Constants.isDev) Log.d(TAG, "clicked" + categoriesDTO.getCategories().get(position).getTitle()); FeedFragment feedFragment = new FeedFragment(); FragmentManager fm = getSupportFragmentManager(); Bundle args = new Bundle(); args.putString("url", Constants.URL_BASE_CATEGORY + categoriesDTO.getCategories().get(position).getSlug()); feedFragment.setArguments(args); fm.beginTransaction().replace(R.id.content_frame, feedFragment).addToBackStack(categoriesDTO.getCategories().get(position).getSlug()).commit(); drawerLayout.closeDrawers(); } }); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { } }); ApplicationController.getmInstance().addToRequestQueue(stringRequest); } public void initFeed() { FragmentManager fm = getSupportFragmentManager(); Bundle args = new Bundle(); args.putString("url", Constants.URL_BASE); feedFragment.setArguments(args); fm.beginTransaction().replace(R.id.content_frame, feedFragment).commit(); } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); switch (id) { case android.R.id.home: drawerLayout.openDrawer(GravityCompat.START); return true; } return super.onOptionsItemSelected(item); } @Override protected void onResume() { super.onResume(); if (Constants.isDev) Log.i(TAG, "Setting screen name: " + TAG); mTracker.setScreenName("Image~" + TAG); mTracker.send(new HitBuilders.ScreenViewBuilder().build()); } @Override public void onBackPressed() { super.onBackPressed(); //moveTaskToBack(true); } } 

редактировать

mcve

Это HomeActivity.

 public class HomeActivity extends AppCompatActivity { private final String TAG = getClass().getName(); private DrawerLayout drawerLayout; private FragmentManager fragmentManager; private FeedFragment feedFragment = new FeedFragment(); private Toolbar toolbar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.home_activity); fragmentManager = getSupportFragmentManager(); initToolbar(); initFeed(); } public void initToolbar() { toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_action_menu_inactive); getSupportActionBar().setDisplayHomeAsUpEnabled(true); } public void initUi() { drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); } public void initFeed() { Bundle args = new Bundle(); args.putString("url", Constants.URL_BASE); feedFragment.setArguments(args); fragmentManager.beginTransaction().replace(R.id.content_frame, feedFragment).commit(); } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); switch (id) { case android.R.id.home: drawerLayout.openDrawer(GravityCompat.START); return true; } return super.onOptionsItemSelected(item); } @Override protected void onResume() { super.onResume(); if (Constants.isDev) Log.i(TAG, "Setting screen name: " + TAG); mTracker.setScreenName("Image~" + TAG); mTracker.send(new HitBuilders.ScreenViewBuilder().build()); } @Override public void onBackPressed() { super.onBackPressed(); } } 

Это фрагмент.

 public class FeedFragment extends Fragment { private final String TAG = getClass().getName(); private View view; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { view = inflater.inflate(R.layout.feed_fragment, container, false); return view; } 

Этот код в порядке, здесь нет проблем, когда вы начинаете свою деятельность, вы не ставите ее на задний стек.

 FragmentManager fm = getSupportFragmentManager(); Bundle args = new Bundle(); args.putString("url", Constants.URL_BASE); feedFragment.setArguments(args); fm.beginTransaction().replace(R.id.content_frame, feedFragment).commit(); 

Но после initUI () вы вызываете метод loadcategories (), в который вы помещаете фрагмент фида в стопку. Вот почему вам нужно нажать два раза.

 FeedFragment feedFragment = new FeedFragment(); FragmentManager fm = getSupportFragmentManager(); Bundle args = new Bundle(); args.putString("url", Constants.URL_BASE_CATEGORY + categoriesDTO.getCategories().get(position).getSlug()); feedFragment.setArguments(args); fm.beginTransaction().replace(R.id.content_frame, feedFragment).addToBackStack(categoriesDTO.getCategories().get(position).getSlug()).commit(); 

Сделать одно

 @Override public void onBackPressed() { FragmentManager fm = getFragmentManager(); if(fm.getBackStackEntryCount() == 1){ fm.popBackStack ("YOUR_TAG",FragmentManager.POP_BACK_STACK_INCLUSIVE); } super.onBackPressed(); } 
 Try to make own switch like: import android.support.v4.app.Fragment; and make switch case and use it like this: case 44: { page = 44; fragment = new FragmentOne(); getSupportActionBar().setTitle(R.string.page_44); action = true; break; } if (action) { FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager.beginTransaction() .replace(R.id.container_body, fragment) .commit(); } and finally in backpress(){ displayView(44);} 

Если вы имеете в виду, что ваше приложение показывает пустой фрагмент, которого не должно быть, тогда вам нужно отредактировать транзакцию фрагмента, получить фрагмент из контейнера и добавить какое-то условие, чтобы добавить его в backstack, когда первый фрагмент не равен нулю. См. Пример ниже

 Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.content_frame); FragmentManager fm = getSupportFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); ft.replace(R.id.content_frame, feedFragment) if(fragment != null){ ft.addToBackStack(categoriesDTO.getCategories().get(position).getSlug()); } ft.commit(); 

Надеюсь эта помощь 🙂

Я добавляю такие фрагменты:

 private void addTransaction(Fragment fragment) { FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.replace(R.id.content_frame, fragment, "visible_fragment"); ft.addToBackStack(null); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); ft.commit(); } 

Я использую это для управления транзакциями фрагментов на задней кнопке:

 public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { if (drawer.isDrawerOpen(GravityCompat.START)) { drawer.closeDrawer(Gravity.LEFT); //CLOSE Nav Drawer! } else { if (getFragmentManager().getBackStackEntryCount() == 0) { this.finish(); return false; } if (getFragmentManager().getBackStackEntryCount() > 1) { getFragmentManager().popBackStack(); removeCurrentFragment(); return false; } } } return super.onKeyDown(keyCode, event); } 

Удаление текущего фрагмента из стопки

 public void removeCurrentFragment() { FragmentTransaction transaction = getFragmentManager().beginTransaction(); Fragment currentFrag = getFragmentManager().findFragmentByTag("visible_fragment"); String fragName = "NONE"; if (currentFrag != null) { fragName = currentFrag.getClass().getSimpleName(); transaction.remove(currentFrag); } transaction.commit(); } 

Чтобы обрабатывать изменения в backstack, вы должны реализовать FragmentManager.OnBackStackChangedListener в своей деятельности и @Override onBackStackChanged() , например:

 @Override public void onBackStackChanged() { // Get your current fragment Fragment fragment = getFragment(); // Update your UI such as title, drawer selected options, etc } private Fragment getFragment() { return getFragmentManager().findFragmentByTag("visible_fragment"); } 

Надеюсь, поможет.

Внутри вашего onBackPressed добавьте это перед super.onBackPressed ():

 moveTaskToBack(true); 

РЕДАКТИРОВАТЬ

Для достижения требуемой функциональности, попробуйте следующее:

  @Override public void onBackPressed() { int count = getFragmentManager().getBackStackEntryCount(); //pop all fragments till it remains the first fragment then move to background if (count == 1) { super.onBackPressed(); //additional code } else { getFragmentManager().popBackStack(); } } 
Intereting Posts
Значки флажков Android appcompat-v7: 21.0.0 Отключение многооконной функции для Android N, не работающей на активность Как я могу сделать липкие заголовки в RecyclerView? (Без внешней библиотеки) Что делать, если производитель удаляет папки под папкой / dev / log? .SQLiteException: рядом с ",": синтаксическая ошибка (код 1): при компиляции: Изменение местоположения значка аккумулятора на пользовательской стороне ношения одежды для Android Воспроизведение видео дает черный экран, но со звуком Ошибка: выполнение выполнено для задачи ': app: transformClassesAndResourcesWithProguardForDebug' Как определяются значения идентификатора ресурса в Android? RxJava flatMapIterable с одним Как добавить номер версии в мои файлы APK с использованием 0.14+ версий плагина Android Gradle? SoundPool: ошибка при создании AudioTrack Использовать кнопочную кнопку Android 4.0 Копирование предупреждающего сообщения при наведении на WORD в Android Studio с помощью Mac Как интегрировать платежный шлюз ATOM в моем приложении?