Android片段堆栈 - 后退(向上)按钮不起作用

时间:2016-03-22 21:33:36

标签: android android-fragments fragment-backstack

我是Android新手。我很惊讶Android Studio没有用于片段之间导航的模板。我现在花了几天时间,但仍然无法使我的代码正常工作。 我有单个活动和两个片段 - MainFragment和AboutFragment。可通过抽屉菜单项访问。我想按回动作栏按钮返回MainFragment。问题是按钮不起作用。任何人都可以帮助我吗?

完成最小的Android Studio项目: test.zip

这是我的活动课程:

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener,
    MainFragment.OnFragmentInteractionListener, AboutFragment.OnFragmentInteractionListener {

private DrawerLayout drawer;
private boolean zOrderSet = false;
private ActionBarDrawerToggle toggleListener;

private FragmentManager.OnBackStackChangedListener mOnBackStackChangedListener =
        new FragmentManager.OnBackStackChangedListener() {
    @Override
    public void onBackStackChanged() {
        syncActionBarArrowState();
    }
};

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    toggleListener = new ActionBarDrawerToggle(this, drawer, toolbar,
            R.string.navigation_drawer_open, R.string.navigation_drawer_close) {

        @Override
        public void onDrawerSlide(View drawerView, float slideOffset) {
            super.onDrawerSlide(drawerView, slideOffset);
            if (!zOrderSet) {
                drawer.bringChildToFront(drawerView);
                drawer.requestLayout();
                drawer.invalidate();
                zOrderSet = true;
            }
        }

        public void onDrawerClosed(View view) {
            syncActionBarArrowState();
        }

        public void onDrawerOpened(View drawerView) {
            toggleListener.setDrawerIndicatorEnabled(true);
        }

    };
    drawer.setDrawerListener(toggleListener);
    toggleListener.syncState();
    getSupportFragmentManager().addOnBackStackChangedListener(mOnBackStackChangedListener);


    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);
    getSupportFragmentManager().beginTransaction().replace(R.id.flContent, MainFragment.newInstance("", "")).commit();
}

@Override
protected void onDestroy() {
    getSupportFragmentManager().removeOnBackStackChangedListener(mOnBackStackChangedListener);
    super.onDestroy();
}

private void syncActionBarArrowState() {
    boolean empty = getSupportFragmentManager().getBackStackEntryCount() == 0;
    toggleListener.setDrawerIndicatorEnabled(empty);
    getSupportActionBar().setDisplayHomeAsUpEnabled(!empty);
}

@Override
public void onBackPressed() {
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        super.onBackPressed();
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (toggleListener.isDrawerIndicatorEnabled() && toggleListener.onOptionsItemSelected(item)) {
        return true;
    }

    int id = item.getItemId();
    if (id == android.R.id.home && getSupportFragmentManager().popBackStackImmediate()) {
        return true;
    }

    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

@Override
public boolean onNavigationItemSelected(MenuItem item) {
    FragmentTransaction ta = getSupportFragmentManager().beginTransaction();
    try {
        switch (item.getItemId()) {
            case R.id.nav_restart:
                ta.replace(R.id.flContent, MainFragment.class.newInstance());
                break;
            case R.id.nav_about:
                ta.replace(R.id.flContent, AboutFragment.class.newInstance()).addToBackStack(null);
                break;
            default:
                return false;
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        ta.commit();
    }

    drawer.closeDrawer(GravityCompat.START);
    return true;
}

@Override
public void onFragmentInteraction(Uri uri) {

}

}

1 个答案:

答案 0 :(得分:0)

@Override
public void onBackPressed(){
 getActivity().getFragmentManager().beginTransaction().remove(this).commit();
}