片段导航无法使用ActionBar上的后退按钮,物理

时间:2016-06-21 14:19:01

标签: java android android-fragments android-actionbar

使用Android目标API 24,minver 15,我正在编写一个基于" One Activity,Multiple Fragments "哲学,我不能去" up"片段的层次结构通过ActionBar上的后退按钮

手机上物理没问题。

我很高兴,因为即使我发现了许多类似的问题和教程,在这种情况下问题似乎不是导航本身,因为唯一不起作用的是后插入符号

这是当前的Fragment层次结构:

[A] [B]
 |
[C]

当我从NavigationDrawer转到Fragments [A][B]时,一切正常。在Fragment [A]内,其中包含ListView,然后我点击了一个元素,该代码将我带到Fragment [C],其代码如下:

FragmentA.java

    ((MainActivity)getActivity()).mDrawerToggle.setDrawerIndicatorEnabled(false);
    ((MainActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getActivity().getSupportFragmentManager().beginTransaction()
            .replace(R.id.frame, new DetailFragment())
            .addToBackStack(null)
            .commit();

这样,Fragment [C]显示,汉堡包图标成为后插入符号。我可以导航到之前Fragment [A]点击Android手机(底部)上的物理后退按钮,但点击后面的插入符号则无效。

其他部分的相关代码,其中包含(错过)执行的评论。

MainActivity.java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
/* ... */
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    mDrawerToggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.setDrawerListener(mDrawerToggle);
    mDrawerToggle.syncState();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
        /* IF I CLICK ON THE "SETTINGS" BUTTON
        *  IN THE ActionBar, THIS GETS EXECUTED 
        *  BUT IS NEVER EXECUTED ON "BACK CARET" PRESS
        */
    int id = item.getItemId();
    Toast.makeText(this, "Activity onOptionsItemSelected", Toast.LENGTH_SHORT).show();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

@Override
public void onBackPressed() {
    /* THIS GETS EXECUTED WHEN I PRESS THE PHYSICAL 
    *  BACK BUTTON ON THE PHONE
    */
    Toast.makeText(this, "BACK", Toast.LENGTH_SHORT).show();
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        super.onBackPressed();
    }
}

FragmentC.java

@Override
public boolean onOptionsItemSelected(MenuItem item){
    /* NEVER EXECUTED.*/
    Toast.makeText(getActivity(), "Fragment onOptionsItemSelected", Toast.LENGTH_SHORT).show();
    switch(item.getItemId()){
        case android.R.id.home:
            getActivity().onBackPressed();
            break;
    }
    return super.onOptionsItemSelected(item);
}

我已经在SO上阅读了各种Android文档和问题/答案,并且或多或少地实现了所有内容,但没有成功。

如何让ActionBar后退按钮有效?

2 个答案:

答案 0 :(得分:0)

   ((MainActivity)getActivity()).mDrawerToggle.setDrawerIndicatorEnabled(false);
((MainActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getActivity().getSupportFragmentManager().beginTransaction()
        .add(R.id.frame, new DetailFragment())//here add add fragment on stack 
        .addToBackStack(null)
        .commit();

答案 1 :(得分:0)

问题是我(嗯,示例NavigationDrawer Android项目)正在使用工具栏。

在这种情况下,要恢复工作,您需要添加以下内容:

    mDrawerToggle.setToolbarNavigationClickListener(
            new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onBackPressed();
            }
        }
    );

所有常用的方法都不起作用。