无论我尝试做什么,UpButton都不起作用



在我的应用程序(minSdkVersion 15)中,我有一个Toolbar而不是ActionBar,并且NavigationDrawer在片段之间切换。有些片段TabBar里面有子片段。这些子片段是ListView的,它们的onItemClickListener触发器DetailFragment。我打电话给setDisplayHomeAsUpEnabled()DetailFragment出现了一个向上箭头,但我无法将其视为执行任何操作,甚至无法显示烤面包。我已经尝试过这个并在onOptionsItemSelected()处理switch (item.getItemId())但这两种解决方案都不适合我。我错过了一些东西,但无法识别什么。

这是我的代码:

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(); //...

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();
}

我的整个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);
}

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

    // 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();

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

我找到了这个,这似乎是正确的答案,但我不明白如何实现它,也没有名声问作者。

我可以尝试什么来使向上按钮工作?

两个新问题:当我设置

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);
        }
    }
}

。从子片段中,我按下硬件"后退"按钮,返回到上一个片段,出现汉堡包图标。但是向上按钮仍然没有从子片段响应。我相信这是因为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);
        }
    }
}

。然后ActionBarDrawerToggle处理向上按钮的单击并像汉堡图标一样打开抽屉。但是当我按下硬件后退按钮时,向上按钮(箭头)消失了,汉堡包图标也没有出现。

所以现在我看到了解决这个问题的两种方法。首先,我可以弄清楚谁在什么时候管理向上按钮

actionBarDrawerToggle.setDrawerIndicatorEnabled(false);

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

或者,当向上按钮箭头而不是汉堡图标可用时,如何覆盖ActionBarDrawerToggle行为以执行其他操作?以及如何在按下硬件后退按钮时出现汉堡图标?

答案正如我所期望的那样简单,但我花了一天多的时间才弄清楚这一点。我逐步实现了抽屉,发现每种方法的文档。运行应用以注意到任何更改。我发现当设置显示家庭作为启用(true)时,它只是在后退箭头图标上更改抽屉汉堡图标,但是当您单击后退箭头时,它会执行相同的操作(显示隐藏抽屉)。

当你想实现后退箭头的另一个行为时,你应该设置抽屉指示器启用(false),然后设置工具栏导航点击监听器()。所以

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);
    }
}

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

协同工作以实现自定义向上按钮行为。希望它能帮助到某人。

似乎您没有处理onOptionsItemSelected()内部的ActionBarDrawerToggle。同时返回用于使用所选内容的true。请尝试以下操作:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Pass the event to ActionBarDrawerToggle, if it returns
    // true, then it has handled the app icon touch event
    if (actionBarDrawerToggle.onOptionsItemSelected(item)) {
        return true;
    }
    // Handle your other action bar items...
    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();
            return true;
        case R.id.action_search:
            Toast.makeText(this, "Search", Toast.LENGTH_SHORT).show();
            return true;
    }
    return super.onOptionsItemSelected(item);
}

相关内容

  • 没有找到相关文章

最新更新