【问题标题】:Android fragments stack - back (up) button does not workAndroid 片段堆栈 - 后退(向上)按钮不起作用
【发布时间】:2016-03-25 23:51:15
【问题描述】:

我是 Android 的新手。我很惊讶 Android Studio 没有用于在 Fragment 之间导航的模板。我已经花了几天时间,但仍然无法使我的代码正常工作。 我有一个活动和两个片段 - 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) {

}

}

【问题讨论】:

  • 您可以使用替换并仍然保留回栈历史记录。您是否阅读了其他暗示的内容?
  • @Doug 谢谢,会知道的。但这并不能解决问题 - 当我单击操作栏后退按钮时,不会调用 onOptionsItemSelected()

标签: android android-fragments fragment-backstack


【解决方案1】:
@Override
public void onBackPressed(){
 getActivity().getFragmentManager().beginTransaction().remove(this).commit();
}

【讨论】:

  • 您能解释一下如何这段代码应该有帮助吗?仅仅放入代码转储并不能真正帮助未来的人们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-27
  • 1970-01-01
  • 2021-10-26
  • 1970-01-01
相关资源
最近更新 更多