无论我尝试做什么,UpButton都无法正常工作

Ale*_*ost 5 android android-fragments up-button

在我的应用程序(minSdkVersion15)我有一个Toolbar,而不是ActionBarNavigationDrawer片段之间的切换.一些TabBar片段里面有子片段.这些子片段是ListViews和它们的onItemClickListener触发器DetailFragment.我打电话给出setDisplayHomeAsUpEnabled()了一个向上的箭头,DetailFragment但是我不能对它进行任何动作,甚至是敬酒.我已经尝试了这个和处理switch (item.getItemId()),onOptionsItemSelected()但两种解决方案都不适合我.我错过了什么,却无法辨认出什么.

这是我的代码:

public class MainActivity extends AppCompatActivity implements FragmentManager.OnBackStackChangedListener {

//...

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //Listen for changes in the back stack
    getSupportFragmentManager().addOnBackStackChangedListener(this);
    //Handle when activity is recreated like on orientation Change
    shouldDisplayHomeUp();

    mToolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(mToolbar);
    final ActionBar actionBar = getSupportActionBar(); //...
Run Code Online (Sandbox Code Playgroud)

...

public void shouldDisplayHomeUp(){
    //Enable Up button only  if there are entries in the back stack
    boolean canback = getSupportFragmentManager().getBackStackEntryCount()>0;
    if (getSupportActionBar() != null) {
        getSupportActionBar().setDisplayHomeAsUpEnabled(canback);
        actionBarDrawerToggle.setDrawerIndicatorEnabled(!canback);
    }
}

@Override
public boolean onNavigateUp() {
    //This method is called when the up button is pressed. Just the pop back stack.
    getSupportFragmentManager().popBackStack();
    return true;
}

@Override
public void onBackStackChanged() {
    shouldDisplayHomeUp();
}
Run Code Online (Sandbox Code Playgroud)

我的全部onOptionsItemSelected:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    switch (item.getItemId()) {
        case android.R.id.home:
            Toast.makeText(this, "Up button!", Toast.LENGTH_SHORT).show();
            //called when the up affordance/carat in actionbar is pressed
            onBackPressed();
            break;
        case R.id.action_search:
            Toast.makeText(this, "Search", Toast.LENGTH_SHORT).show();
            break;
    }
    return super.onOptionsItemSelected(item);
}
Run Code Online (Sandbox Code Playgroud)

我不知道其他代码是否重要:

    // Initializing Drawer Layout and ActionBarToggle
    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer);
    mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
    actionBarDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,mToolbar,R.string.openDrawer, R.string.closeDrawer){//...


    //Setting the actionbarToggle to drawer layout
    mDrawerLayout.setDrawerListener(actionBarDrawerToggle);

    //calling sync state is necessay or else your hamburger icon wont show up
    actionBarDrawerToggle.syncState();
Run Code Online (Sandbox Code Playgroud)

在我的清单中,我没有父母活动.

我找到了这个,它似乎是正确的答案,但我不明白如何实现它,并没有声称要求作者.

我可以尝试使用向上按钮工作吗?

两个新问题:我设置时

public void shouldDisplayHomeUp(){
    //Enable Up button only  if there are entries in the back stack
    if (getSupportActionBar() != null) {
        if (getSupportFragmentManager().getBackStackEntryCount()>0) {
            actionBarDrawerToggle.setDrawerIndicatorEnabled(false);
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        } else {
            getSupportActionBar().setDisplayHomeAsUpEnabled(false);
            actionBarDrawerToggle.setDrawerIndicatorEnabled(true);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

...从子片段我按下硬件"后退"按钮我返回上一个片段,然后出现汉堡包图标.但是向上按钮仍然没有来自子片段的响应.我相信这是因为ActionBarDrawerToggle不再管理它的行为了.但谁管理它呢?如果我这样设置这个方法:

public void shouldDisplayHomeUp(){
    //Enable Up button only  if there are entries in the back stack
    if (getSupportActionBar() != null) {
        if (getSupportFragmentManager().getBackStackEntryCount()>0) {
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        } else {
            getSupportActionBar().setDisplayHomeAsUpEnabled(false);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

...然后ActionBarDrawerToggle处理点击向上按钮并打开抽屉,就像汉堡包图标一样.但是当我按下硬件后退按钮时,向上按钮(箭头)消失,汉堡包图标不会出现.

所以现在我看到两种方法来解决这个问题.首先,我可以确定谁在管理向上按钮时

actionBarDrawerToggle.setDrawerIndicatorEnabled(false);
Run Code Online (Sandbox Code Playgroud)

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
Run Code Online (Sandbox Code Playgroud)

或者,ActionBarDrawerToggle当向上按钮箭头可用而不是汉堡包图标时,如何覆盖行为以执行另一个操作?当我按下硬件后退按钮时,如何使汉堡包图标出现?

Ale*_*ost 3

正如我所料,答案很简单,但我花了一天多的时间才弄清楚。我一步步实现了抽屉,发现每种方法的文档。运行应用程序以注意到任何变化。我发现,当setDisplayHomeAsUpEnabled(true)时,它只会更改后退箭头图标上的抽屉汉堡包图标,但是当您单击后退箭头时,它会执行相同的操作(显示-隐藏抽屉)。

当您想实现后退箭头的另一种行为时,您也应该setDrawerIndicatorEnabled(false)然后setToolbarNavigationClickListener()。所以

public void shouldDisplayHomeUp(){
//Enable Up button only  if there are entries in the back stack
if (getSupportActionBar() != null) {
    if (getSupportFragmentManager().getBackStackEntryCount()>0) {
        actionBarDrawerToggle.setDrawerIndicatorEnabled(false); // order matters
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    } else {
        getSupportActionBar().setDisplayHomeAsUpEnabled(false);
        actionBarDrawerToggle.setDrawerIndicatorEnabled(true);
    }
}
Run Code Online (Sandbox Code Playgroud)

actionBarDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(getApplicationContext(), "ToolbarNavigationClickListener", Toast.LENGTH_SHORT).show();
        }
    });
Run Code Online (Sandbox Code Playgroud)

协同工作以实现自定义 UpButton 行为。希望它能帮助别人。