0

Я на самом деле работаю над фрагментами, а не с действиями. Так что на панели навигации вы можете щелкнуть различные фрагменты на экране. Основываясь на моем коде, , если я перехожу из Activity A до фрагмента b, затем фрагмент c, снова в b, затем, если я нажму кнопку «Назад», тогда он переместит меня в MainActivity A. Но вот проблема. Когда я хочу добавить подтверждение в диалоговом окне exit на MainActivity onBackPress(), появляется каждый раз, когда я нажимаю кнопку «Назад», независимо от того, какая страница открыта, но я хочу, чтобы она появлялась только тогда, когда в заднем стекле не осталось фрагментов. Мне нужна помощь по этой проблеме., поддерживающий задний стек для фрагментов, а также подтверждение при выходе

Here is my MainActivity code:-- 

    package archerpenny.impdrawerfragment; 


import android.content.DialogInterface; 
import android.support.v4.app.Fragment; 

import android.support.v4.app.FragmentManager; 
import android.support.v4.widget.DrawerLayout; 

import android.os.Bundle; 
import android.support.v7.app.ActionBarDrawerToggle; 
import android.support.v7.app.AlertDialog; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.support.v7.widget.Toolbar; 

import android.view.MenuItem; 

import android.view.View; 


public class MainActivity extends AppCompatActivity { 
    ActionBarDrawerToggle mDrawerToggle; 
    RecyclerView.Adapter mAdapter; 
    RecyclerView recyclerView; 
    DrawerLayout mDrawerLayout; 
    FragmentManager fragmentManager; 
    Fragment blankFragment=null; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mAdapter = new NavigationDrawerAdapter(this); 
     mDrawerLayout=(DrawerLayout)findViewById(R.id.drawer_layout); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     NavigationDrawerAdapter adapter; 

     recyclerView = (RecyclerView)findViewById(R.id.DrawerList); 
     recyclerView.setHasFixedSize(true); 
     LinearLayoutManager llm = new LinearLayoutManager(this); 
     recyclerView.setLayoutManager(llm); 
     recyclerView.setAdapter(mAdapter); 

     getSupportActionBar().setDisplayShowTitleEnabled(false); 

     mDrawerToggle = new ActionBarDrawerToggle(this,mDrawerLayout,toolbar,R.string.open,R.string.close) { 
      @Override 
      public void onDrawerOpened(View drawerView) { 
       super.onDrawerOpened(drawerView); 
      } 

      @Override 
      public void onDrawerClosed(View drawerView) { 
       super.onDrawerClosed(drawerView); 
      } 
     }; 

     mDrawerLayout.setDrawerListener(mDrawerToggle); 
     getSupportActionBar().setHomeButtonEnabled(true); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     recyclerView.addOnItemTouchListener(
       new RecyclerItemClickListener(MainActivity.this, new RecyclerItemClickListener.OnItemClickListener() { 
        @Override 
        public void onItemClick(View view, int position) { 
         // do whatever 

         if(position==0) 
         { 
          blankFragment=new BlankFragment(); 

         } 
         if (position==1) 
         { 
          blankFragment=new BlankFragment2(); 
         } 
         if (position==2) 
         { 
          blankFragment=new BlankFragment3(); 
         } 
         android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager(); 
         getSupportFragmentManager().popBackStack(); 
         fragmentManager.beginTransaction() 
           .add(R.id.container_body, blankFragment).addToBackStack("fragBack").commit(); 
         mDrawerLayout.closeDrawers(); 
        } 
       }) 
     ); 
    } 
    @Override 
    public void onBackPressed() { 
     if(getSupportFragmentManager().findFragmentByTag("fragBack") != null) 
     { 
      getSupportFragmentManager().popBackStack(); 
      getSupportFragmentManager().beginTransaction().add(R.id.container_body, blankFragment).addToBackStack("fragBack").commit(); 
     } 
     else { 
      new AlertDialog.Builder(this) 
        .setIcon(android.R.drawable.ic_dialog_alert) 
        .setTitle("Closing Activity") 
        .setMessage("Are you sure you want to close this activity?") 
        .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which) { 
          finish(); 
         } 

        }) 
        .setNegativeButton("No", null) 
        .show(); 



     } 
    } 

    @Override 
    protected void onPostCreate(Bundle savedInstanceState) { 
     super.onPostCreate(savedInstanceState); 
     mDrawerToggle.syncState(); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     if (mDrawerToggle.onOptionsItemSelected(item)) { 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

} 

ответ

0

Внутри вашей деятельности, которая обрабатывает все фрагменты, использовать

@Override 
public void onBackPressed() { 
int count = getSupportFragmentManager().getBackStackEntryCount(); 
if (count == 0) { 

super.onBackPressed();  

//you can add your alertdialog code here and after pressing positive button of alertdialog you can call super.onBackPressed()  
} 
else {    
     getSupportFragmentManager().popBackStack();    
    } 
} 

Когда фрагмент backstack число записей равно 0, это означает, что все фрагменты извлекаются из backstack , Поэтому вы просто выполняете super.onBackPressed(). Однако, когда стек не пуст, когда вы нажимаете кнопку «Назад», вам нужно вытащить самый верхний фрагмент из задней части, чтобы произошла правильная обратная навигация.

Надеюсь, это вам поможет. Однако, если вы не уверены, правильно ли вы добавляете/заменяете свои фрагменты или нет, обратитесь к my answer in this post.

+1

@ Sash_KP - благодарю вас .. это работает .. :) –

+0

Это точно такой же ответ, который я опубликовал несколько часов назад, вы только что приняли своих друзей, отправив ответ –

1

Я не уверен, почему вы полагаетесь на повторное использование этого тега «fragBack»? Столбец обеспечивает все, что вам нужно. Попробуйте что-то вроде следующего:

public void onBackPressed() { 
    FragmentManager fragMgr = getSupportFragmentManager(); 
    if (fragMgr.getBackStackEntryCount() > 0) { 
     fragMgr.popBackStackImmediate(); //or whatever 
    } else { 
     //show the dialog 
    } 
}