当前位置: 首页 > 知识库问答 >
问题:

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

祁英哲
2023-03-14

在我的应用程序(minSdkVersion)中,我有一个工具栏,而不是在片段之间切换。一些片段有标签栏,里面有子片段。这些子片段是ListView,它们的触发器是DetailFragment。我调用setDisplayHomeAsUpEnabled(),出现了一个向上箭头,表示DetailFragment,但我无法处理它来执行任何操作,甚至无法显示toast。我尝试了这个方法,并在选项ItemSelected()中处理了开关(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();
}

我的整个选项项已选定:

@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.setDrawerIndicatorEnabled(false);

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

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

共有2个答案

屈晨
2023-03-14

似乎您没有在onOptionsItemSelec()中处理ActionBarDrawerTougle。还返回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);
}
孟品
2023-03-14

答案和我预期的一样简单,但我花了一天多的时间来弄清楚这一点。我一步一步地实现了抽屉,发现每种方法的留档。运行应用程序来注意任何变化。我发现当setDisplayHomeAsUpEngic(true)时,它只是在向后箭头图标上更改抽屉汉堡图标,但当您单击向后箭头时,它会执行相同的操作(显示隐藏抽屉)。

当您想要为back arrow实现另一个行为时,您也应该设置DrawerIndicatorEnabled(false),然后设置ToolbarNavigationClickListener()。所以

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

共同努力实现自定义的上扣行为。希望它能帮助别人。

 类似资料:
  • 我刚刚安装了一台新的计算机--全新的Java1.8安装,全新的3.5.2 Maven配置,现在我正在创建一个全新的quickstart Maven项目。 当我添加父Spring Boot启动程序和单个依赖项时,无论我做什么,它都无法解析它。

  • 我正在尝试向我用SceneBuilder创建的FXML文件中存在的ChoiceBox添加值,但当我尝试这样做时(在main类中),无论我尝试什么,我都会得到一个NullPointerException。请注意,当我注释掉方法中的ChoiceBox代码(参见下面)时,项目成功运行,因此NPE没有其他原因。 null 堆栈跟踪

  • 我尝试样式复选框背景颜色,但它不会改变任何我做。我正在使用最新的火狐29。 是否在css中或浏览器中有一些规则更改? CSS: 下面是一个演示http://jsfidle.net/6kxrg/

  • 在Java中,什么与Python的pass等效?我意识到我可以使用continue语句或不完成语句体来实现这种效果,但我喜欢使用pass语句。

  • 我的配置文件是类路径的路径。至少我认为是这样。我放置了log4j。资源文件夹中的属性文件,而log4j对此不做任何处理。即使我删除了它,也不会发生错误。 任何人都可以看到,我在使用maven LoggerTest的内容: 程序输出: log4j的内容。属性: 在波姆。xml并不是什么不同寻常的东西,只是一个依赖组织。阿帕奇。登录中。log4j log4j内核2.17.2,编译器源目标是16,没有插

  • 我正在编写if-else语句,如果满足某个条件,我希望程序什么也不做。下面的代码显示了我的意思。 如果number等于零,我希望程序保留这个If-else语句,并移动到下一段代码,这段代码在while循环中