维护片段的返回堆栈并在退出时确认
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。
我实际上是在处理片段而不是活动。所以在导航抽屉项目上单击不同的片段出现在我的代码 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。