【问题标题】:Menu shows when it shouldn't as I set it false菜单显示何时不应该显示,因为我将其设置为 false
【发布时间】:2016-11-02 20:02:11
【问题描述】:

我的应用遇到了另一个问题。当猫死时,我点击“结果屏幕”(这不是一个新活动,但我隐藏了所有当前元素并显示一个新的文本视图来指示死亡原因),我想隐藏菜单项,但对于某些原因是它没有回复isHeDead()

基本上,问题似乎在于它在onCreateOptionsMenu 中看不到“return false”,因为出于某种原因isHeDead() 在那里不起作用,即使该方法在其他任何地方都有效。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(fab_menu, menu);
    while (!isHeDead()){
        return true;
    }
    return false;
}

public Boolean isHeDead() {
    TextView t = (TextView) findViewById(R.id.textDiedOf);
    TextView textName = (TextView) findViewById(R.id.CatsTitleStats);
    TextView textAge = (TextView) findViewById(R.id.CatsAgeStat);
    TextView textStats1 = (TextView) findViewById(R.id.CatsStats);
    TextView textStats2 = (TextView) findViewById(R.id.CatsStats2);
    ImageView image = (ImageView) findViewById(R.id.imageViewCat);

    if (cat.getAge() >= 20) {
        textName.setVisibility(View.GONE);
        textAge.setVisibility(View.GONE);
        textStats1.setVisibility(View.GONE);
        textStats2.setVisibility(View.GONE);
        image.setVisibility(View.GONE);
        t.setText("Sorry! " + getIntent().getStringExtra(KEY_NAME_EXTRA) + " died of old age.");
        return true;
    } else if (cat.getAnger() >= 10) {
        textName.setVisibility(GONE);
        textAge.setVisibility(View.GONE);
        textStats1.setVisibility(View.GONE);
        textStats2.setVisibility(View.GONE);
        image.setVisibility(View.GONE);
        t.setText("Sorry! " + getIntent().getStringExtra(KEY_NAME_EXTRA) + " died of madness.");
        return true;
    } ///etc...
}

用户选项(不确定这是否与菜单问题有关,但仍然存在)。

public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {

        /// FEED ///
        case R.id.action_feed:
            int qualityRandom = (int) (Math.random() * 10);
            if (qualityRandom == 5) {
                cat.happy(-2);
                cat.healthy(-30);
                cat.angry(2);
                cat.thirsty(2);

                ageStat();
                Stats1();
                Stats2();

                if (isHeDead()) {
                    break;
                } else {
                    Toast.makeText(CatStatus.this, "Food was in a poor state...", Toast.LENGTH_SHORT).show();
                    break;
                }
            } else {
                cat.happy(1);
                cat.healthy(10);
                cat.hungry(-3);
                cat.angry(-1);

                ageStat();
                Stats1();
                Stats2();

                Toast.makeText(CatStatus.this, "Yummy!", Toast.LENGTH_SHORT).show();
                break;
            }

            /// DRINK ///
        case R.id.action_drink: ///etc...

【问题讨论】:

    标签: java android


    【解决方案1】:

    当你点击结果屏幕时,如果你不去一个新的活动,onCreateOptionsMenu 不会被调用!

    您需要保留对菜单的引用:

    private Menu myMenu;
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(fab_menu, menu);
        this.myMenu = menu;
        while (!isHeDead()){
            return true;
        }
        return false;
    }
    

    然后,您可以像这样在 isHeDead() 方法中调用:

    menu.setGroupVisible(R.id.main_menu_group, false);
    

    或:

    menu.clear();
    

    这取决于你想要什么。

    检查这个答案:

    Hide/Show Action Bar Option Menu Item for different fragments

    【讨论】:

    • 谢谢你!现在工作。有没有办法让这个隐藏动作更快?因为现在它显示了它是如何向左移动和消失的,如果这种情况发生得如此之快以至于用户甚至都不会注意到,我会更喜欢它。这是可能的还是我需要一个新的活动?
    • 在我看来,我会选择片段!您可以只创建一个活动,然后创建两个片段,然后当用户单击查看结果时,您将在两个片段之间进行事务。这是比隐藏元素为用户创建新屏幕更清洁的解决方案。或者你也可以参加两项活动,这很好。但是最好在不同的片段/活动中分离屏幕。
    • 两者。两者都给了我相同的向左移动然后消失的效果。
    • 谢谢!不知道fragment是什么,以前没用过,不过会研究一下!
    【解决方案2】:

    onCreateOptionsMenu 仅在应用启动 Activity 时调用一次

    【讨论】:

    • 谢谢!修复了它,它现在可以工作了,虽然不是我想要的速度!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多