维护片段的返回堆栈并在退出时确认

maintaining a Back stack for fragments as well as confirm on exit

我实际上是在处理片段而不是活动。所以在导航抽屉项目上单击不同的片段出现在我的代码 screen.Based 上, 如果我从 Activity A 移动到片段 b,然后片段 c,再到 b,然后如果我单击后退按钮,它将导航到 MainActivity A.But 这里是 problem.when 我想在 MainActivity onBackPress() 上添加退出对话框确认,无论打开哪个页面,每次单击后退按钮时它都会出现,但我希望它出现只有当后面没有碎片时 stack.I 才需要有关该问题的帮助。

    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);
    }

}

我不确定您为什么依赖于重用 "fragBack" 标签? backstack 提供了你需要的一切。尝试如下操作:

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

在处理所有片段的 activity 中,使用

@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();            
   }
}

当fragment backstack entry count为0时,表示所有的fragment都被pop出backstack。因此,您只需执行 super.onBackPressed() 即可。但是,当堆栈不为空时,当您按下后退按钮时,您需要从后退堆栈中弹出最顶部的片段,以便进行正确的后退导航。

希望对您有所帮助。但是,如果您不确定自己 adding/replacing 片段是否正确,请参考 my answer in this post