【问题标题】:maintaining a Back stack for fragments as well as confirm on exit维护片段的后退堆栈并在退出时确认
【发布时间】:2015-08-05 02:09:25
【问题描述】:

我实际上是在处理片段而不是活动。所以在导航抽屉项目上单击不同的片段出现在屏幕上。根据我的代码, 如果我从活动 A 移动到片段 b,然后是片段 c,再次到 b,然后如果我单击后退按钮,那么它将导航到 MainActivity A。但这是问题所在。当我想添加确认时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);
    }

}

【问题讨论】:

    标签: android android-fragments android-alertdialog fragment-backstack


    【解决方案1】:

    我不确定您为什么要依赖重复使用“fragBack”标签? backstack 提供了你需要的一切。尝试以下方法:

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

    【讨论】:

      【解决方案2】:

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

      @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 都从 backstack 中弹出。因此,您只需执行 super.onBackPressed() 即可。但是,当堆栈不为空时,当您按下后退按钮时,您需要从后退堆栈中弹出最顶部的片段,以便进行正确的后退导航。

      希望这对您有所帮助。但是,如果您不确定是否正确添加/替换片段,请参考my answer in this post

      【讨论】:

      • 这与我几个小时前发布的答案完全相同,您刚刚接受了您朋友对答案的转发
      猜你喜欢
      • 2018-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-23
      相关资源
      最近更新 更多