Android 导航抽屉,处理返回按钮转到以前的片段?

Android 导航抽屉,处理返回按钮转到以前的片段?,android,android-fragments,android-fragmentactivity,navigation-drawer,Android,Android Fragments,Android Fragmentactivity,Navigation Drawer,我正在使用内置导航抽屉运行我的应用程序。我不太明白如何操作后退按钮。当它被按下时,我希望它再次加载第一个片段。碎片1 因此,当应用程序启动时,您会看到Fragment1启动。然后他们可以点击片段2-5转到其他页面。在所有这些页面中,我希望返回按钮将用户带回Fragment1。用户应该能够通过后退按钮退出应用程序的唯一位置是Fragment1 因为这一切都是由一个零碎的活动处理的,所以我试着弄乱了那里的“后退”按钮。我不断收到一个强制关闭错误,但是: (01-11 14:09:33.114: E/

我正在使用内置导航抽屉运行我的应用程序。我不太明白如何操作后退按钮。当它被按下时,我希望它再次加载第一个片段。碎片1

因此,当应用程序启动时,您会看到Fragment1启动。然后他们可以点击片段2-5转到其他页面。在所有这些页面中,我希望返回按钮将用户带回Fragment1。用户应该能够通过后退按钮退出应用程序的唯一位置是Fragment1

因为这一切都是由一个零碎的活动处理的,所以我试着弄乱了那里的“后退”按钮。我不断收到一个强制关闭错误,但是:

(01-11 14:09:33.114: E/AndroidRuntime(8292): android.view.InflateException: Binary XML file line #7: Error inflating class fragment)
这就是我到目前为止所做的:

我已确保将片段添加到后堆栈中,如下所示:

fm.beginTransaction().replace(R.id.main, newFragment).addToBackStack("fragBack").commit();
后退按钮:

@Override
public void onBackPressed() {
    if (getSupportFragmentManager().findFragmentByTag("fragBack") != null) {
        
    }
    else {
        super.onBackPressed();
        return;
    }
    if (getSupportFragmentManager().getBackStackEntryCount() != 0) {
        Toast.makeText(getApplicationContext(), "Test", Toast.LENGTH_LONG).show();
        Fragment frag = getSupportFragmentManager().findFragmentByTag("fragBack");
        FragmentTransaction transac = getSupportFragmentManager().beginTransaction().remove(frag);
                transac.commit();
    }
    
}
有人知道我需要做什么吗?我是否需要在每个片段中调用onBackPressed(如果可能的话),而不是控制抽屉的FragmentActivity?在我过去的应用程序中,无论用户在哪个片段上,我都可以用后退按钮关闭应用程序,但我现在要做的是,我希望后退按钮返回到Fragment1

非常感谢您的帮助,谢谢

麦克里克

@Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            
            Fragment newFragment = new MapsPage();
            FragmentManager fm = getSupportFragmentManager();
            switch(i) {
            case 0:
                newFragment = new Fragment2();
                break;
            case 1:
                newFragment = new Fragment3();
                break;
            case 2:
                newFragment = new Fragment4();
                break;
            case 3:
                newFragment = new Fragment5();
                break;
            }
            fm.beginTransaction().add(R.id.main, newFragment).addToBackStack("fragback").commit();
            drawerLayout.closeDrawer(rl);
        }
@覆盖
公共无效onItemClick(AdapterView AdapterView、View视图、int i、long l){
Fragment newFragment=newmapspage();
FragmentManager fm=getSupportFragmentManager();
开关(一){
案例0:
newFragment=newfragment2();
打破
案例1:
newFragment=newfragment3();
打破
案例2:
newFragment=newfragment4();
打破
案例3:
newFragment=newfragment5();
打破
}
fm.beginTransaction().add(R.id.main,newFragment).addToBackStack(“fragback”).commit();
抽屉布局。封闭抽屉(rl);
}
而不是:

fm.beginTransaction().replace(R.id.main, newFragment).addToBackStack("fragBack").commit();
电话:

addToBackStack与
add
一起使用

replace
函数删除以前的片段并放置新片段,以便在后堆栈中始终只有一个片段。所以,使用add函数将以前的片段保留在堆栈上

要始终从Backpress上的任何片段转到fragemnt1,请尝试执行以下操作:

getFragmentManager().popBackStack();
fm.beginTransaction().add(R.id.main, newFragment).addToBackStack("fragBack").commit();
这将从backstack中删除最后一个事务并添加新事务。
试试这个。

我建议您首先要正确管理事务,以避免覆盖
onBackPressed()
。这将有助于避免在将来实现疯狂的逻辑

为此,我们首先需要在中设置一个私有类变量,该变量将启用初始化:

private boolean popNext = false;
下面的代码允许我们通过将初始back函数放在堆栈上来设置它。此后,每当
popNext
设置为true时,我们弹出初始事务并推送新事务。因此,我们将1>X事务替换为1>Y事务

额外嵌入的
if
语句用于选择初始项,因为我们不想从1>1开始。如果这是我们的第一个案子,我们就关上抽屉。另一种情况需要像“后退”按钮一样操作,但我们需要记住将其设置为返回初始状态

if(popNext){
    if(i == INITIAL_POSITION){
        onBackPressed();
        mDrawerLayout.closeDrawer(mDrawerList);
        popNext = false;
        return;
    }
    getFragmentManager().popBackStackImmediate();
}
else{
    if(i == INITIAL_POSITION){
        mDrawerLayout.closeDrawer(mDrawerList);
        return;
    }
    popNext=true;
}
getFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, fragment)
.addToBackStack(null)
.commit();

注意:我的代码使用了
getFragmentManager()
而不是
getSupportFragmentManager()
,这是一个本机函数,我相信是从Honeycomb开始的。

我只是想报告我的发现,尽管这个问题对于其他可能有相同问题的人来说有点老了。对我来说,按照公认的答案中建议的方法,会使图层重叠,很快使其无法阅读。下面的代码(根据接受的答案改编)避免了重叠,但仍将屏幕添加到后堆栈中

fragmentManager.beginTransaction().replace(R.id.container, fragment).addToBackStack("fragBack").commit();

在某些情况下,您必须使用replace,然后无法使用addtobackstack(),以便可以在MainActivity中使用此代码。在这段代码中,当您按back键时,总是转到第一个片段(我称之为HomeFragment),当您在HomeFragment中时,它会要求两次从应用程序中退出

 private Boolean exit = false;
@Override
    public void onBackPressed() {
        if (exit) {
            super.onBackPressed();
            return;
        }

    try {
        FragmentManager fragmentManager = getSupportFragmentManager();
        Fragment fragment = fragmentManager.findFragmentByTag("HOME");
        if (fragment != null) {
            if (fragment.isVisible()) {
                this.exit = true;
                Toast.makeText(this, "Press Back again to Exit", Toast.LENGTH_SHORT).show();
            }
        }
        else {
            fragment = HomeFragment.class.newInstance();
            getFragmentManager().popBackStack();
            fragmentManager.beginTransaction().replace(R.id.flContent, fragment, "HOME").commit();
        }
    } catch (Exception e) {

    }
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            exit = false;
        }
    }, 2000);
}
-@覆盖
public void onBackPressed(){
抽屉布局抽屉=(抽屉布局)findViewById(R.id.抽屉布局);
int backstack=getSupportFragmentManager().getBackStackEntryCount();
if(抽屉isDrawerOpen(重力压缩机启动)){
抽屉。关闭抽屉(重力压缩机启动);
}否则如果(后退>0){
对于(int i=0;i
我有4个片段附加到底部导航活动 我最近遇到了这个问题,并成功地解决了如下问题 我的活动代码

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.NavigationUI;

import android.os.Bundle;
import android.view.MenuItem;

import com.google.android.material.bottomnavigation.BottomNavigationView;

public class BottomNavigationActivity extends AppCompatActivity
{
    NavController navController;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_bottom_navigation);


        BottomNavigationView bottomNavigationView=findViewById(R.id.bottom_navigation);
        bottomNavigationView.setOnNavigationItemSelectedListener(navListener);

        getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,new FragmentHome()).commit();


    }

    public boolean onSupportNavigateUp() {
        return navController.navigateUp();
    }

    private BottomNavigationView.OnNavigationItemSelectedListener navListener= new
            BottomNavigationView.OnNavigationItemSelectedListener()
            {
                @Override
                public boolean onNavigationItemSelected(@NonNull MenuItem item)
                {

                    Fragment selectedFragment = null ;


                    switch (item.getItemId())
                    {

                        case R.id.nav_home:
                            selectedFragment = new FragmentHome();

                            break;

                        case R.id.nav_search:
                            BottomNavigationActivity.this.getSupportFragmentManager().beginTransaction()
                                    .addToBackStack(null)
                                    .commit();
                            selectedFragment=new FragmentSearch();
                            break;

                        case R.id.nav_cart:
                            BottomNavigationActivity.this.getSupportFragmentManager().beginTransaction()
                                    .addToBackStack(null)
                                    .commit();
                            selectedFragment=new FragmentCart();
                            break;

                        case R.id.nav_user:
                            BottomNavigationActivity.this.getSupportFragmentManager().beginTransaction()
                                    .addToBackStack(null)
                                    .commit();
                                selectedFragment= new FragmentAccount();
                                        break;


                    }

                    getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                            selectedFragment).commit();

                    return true;

                }
            };


    @Override
    public void onBackPressed()
    {
        int backStackEntryCount = getSupportFragmentManager().getBackStackEntryCount();
        if (backStackEntryCount == 0) {
            super.onBackPressed();
        } else
            {
            goHome();
        }
    }

    public void goHome()
    {
        //Following code will set the icon of the bottom navigation to active
        final BottomNavigationView mBottomNav = findViewById(R.id.bottom_navigation);
        MenuItem homeItem = mBottomNav.getMenu().getItem(0);
        mBottomNav.setSelectedItemId(homeItem.getItemId());
        getSupportFragmentManager().popBackStackImmediate();

        //To delete all entries from back stack immediately one by one.
        int backStackEntry = getSupportFragmentManager().getBackStackEntryCount();
        for (int i = 0; i < backStackEntry; i++) {
            getSupportFragmentManager().popBackStackImmediate();
        }
        //To navigate to the Home Fragment
        final FragmentHome homeFragment = new FragmentHome();
        FragmentTransaction myFragmentTransaction = getSupportFragmentManager().beginTransaction();
        myFragmentTransaction.replace(R.id.fragment_container, homeFragment, "HomeFrag Tag");
        myFragmentTransaction.commit();
    }
}
import androidx.annotation.NonNull;
导入androidx.appcompat.app.appcompat活动;
导入androidx.fragment.app.fragment;
导入androidx.fragment.app.FragmentTransaction;
导入androidx.navigation.NavController;
导入androidx.navigation.navigation;
导入androidx.navigation.ui.NavigationUI;
导入android.os.Bundle;
导入android.view.MenuItem;
导入com.google.android.material.bottomnavigation.BottomNavigationView;
公共类BottomNavigationActivity扩展了AppCompativeActivity
{
导航控制器;
@凌驾
创建时受保护的void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u bottom\u导航);
BottomNavigationView BottomNavigationView=findViewById(R.id.bottom\u导航);
bottomNavigationView.setOnNavigationItemSelectedListener(navListener);
getSupportFragmentManager().beginTransactio
 - @Override
       public void onBackPressed() {
           DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
           int backstack = getSupportFragmentManager().getBackStackEntryCount();
           if (drawer.isDrawerOpen(GravityCompat.START)) {
               drawer.closeDrawer(GravityCompat.START);
           } else if (backstack > 0) {
              for (int i = 0; i < backstack; i++) {
                   getSupportFragmentManager().popBackStackImmediate();
            }
       } else {
           this.finish();
        }
    }
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.NavigationUI;

import android.os.Bundle;
import android.view.MenuItem;

import com.google.android.material.bottomnavigation.BottomNavigationView;

public class BottomNavigationActivity extends AppCompatActivity
{
    NavController navController;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_bottom_navigation);


        BottomNavigationView bottomNavigationView=findViewById(R.id.bottom_navigation);
        bottomNavigationView.setOnNavigationItemSelectedListener(navListener);

        getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,new FragmentHome()).commit();


    }

    public boolean onSupportNavigateUp() {
        return navController.navigateUp();
    }

    private BottomNavigationView.OnNavigationItemSelectedListener navListener= new
            BottomNavigationView.OnNavigationItemSelectedListener()
            {
                @Override
                public boolean onNavigationItemSelected(@NonNull MenuItem item)
                {

                    Fragment selectedFragment = null ;


                    switch (item.getItemId())
                    {

                        case R.id.nav_home:
                            selectedFragment = new FragmentHome();

                            break;

                        case R.id.nav_search:
                            BottomNavigationActivity.this.getSupportFragmentManager().beginTransaction()
                                    .addToBackStack(null)
                                    .commit();
                            selectedFragment=new FragmentSearch();
                            break;

                        case R.id.nav_cart:
                            BottomNavigationActivity.this.getSupportFragmentManager().beginTransaction()
                                    .addToBackStack(null)
                                    .commit();
                            selectedFragment=new FragmentCart();
                            break;

                        case R.id.nav_user:
                            BottomNavigationActivity.this.getSupportFragmentManager().beginTransaction()
                                    .addToBackStack(null)
                                    .commit();
                                selectedFragment= new FragmentAccount();
                                        break;


                    }

                    getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                            selectedFragment).commit();

                    return true;

                }
            };


    @Override
    public void onBackPressed()
    {
        int backStackEntryCount = getSupportFragmentManager().getBackStackEntryCount();
        if (backStackEntryCount == 0) {
            super.onBackPressed();
        } else
            {
            goHome();
        }
    }

    public void goHome()
    {
        //Following code will set the icon of the bottom navigation to active
        final BottomNavigationView mBottomNav = findViewById(R.id.bottom_navigation);
        MenuItem homeItem = mBottomNav.getMenu().getItem(0);
        mBottomNav.setSelectedItemId(homeItem.getItemId());
        getSupportFragmentManager().popBackStackImmediate();

        //To delete all entries from back stack immediately one by one.
        int backStackEntry = getSupportFragmentManager().getBackStackEntryCount();
        for (int i = 0; i < backStackEntry; i++) {
            getSupportFragmentManager().popBackStackImmediate();
        }
        //To navigate to the Home Fragment
        final FragmentHome homeFragment = new FragmentHome();
        FragmentTransaction myFragmentTransaction = getSupportFragmentManager().beginTransaction();
        myFragmentTransaction.replace(R.id.fragment_container, homeFragment, "HomeFrag Tag");
        myFragmentTransaction.commit();
    }
}