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

让额外的动作栏图标消失

淳于哲
2023-03-14

我设法解决了一个问题,即在片段事务后,操作栏中会出现一个额外的图标,但这是一个笨拙的解决方案,我想知道是否有更好的方法来解决它。

我有一个片段类层次结构,其中ContentFrament是一个占据整个屏幕(除了动作栏)的抽象片段,它的子类提供了额外的动作栏图标(通过它们各自的onCreateOptionsMenu()onOptionsItemSelec()方法)。例如ContentFragmentA贡献有图标AContentFragmentB图标BContentFragmentB可能是也可能不是ContentFragmentA的子类(如果是,则操作栏将并排包含图标A图标B),依此类推。

最初(用户刚刚登录后)屏幕仅包含ContentFragmentA,操作栏有图标A。当用户浏览应用程序时,其他内容片段(或更准确地说是片段事务)被添加到后堆栈中,图标相应地从操作栏中添加或删除。

直到用户决定注销,这会提示应用程序清除整个后端堆栈(在回滚最旧的事务后将ContentFragmentA带回来),并立即添加一个LoginContentFrament,这有助于在操作栏中添加一个New Profile图标。然而,此时图标A也显示在New Profile图标旁边,我不希望它被显示;这就是我面临的问题。当用户注销时,它应该会消失。

我解决了这个问题,像往常一样清除了后台堆栈,然后包含了一个额外的事务,该事务用一个空白的、无图标的内容片段替换了ContentFragmentA,并使用sethaoptions菜单(false),因此当空白片段替换为登录片段时,图标a将消失。但我觉得这很笨拙,我认为可能有更好的方法。

我已经尝试调用Menu.clear()ContentFrament超类和在片段替换步骤ctivity.supportInvalidateOptionsMenu(),但似乎都不起作用。

有人知道另一种选择吗?

相关代码:

内容片段。java:

public abstract class ContentFragment extends Fragment {

    public static interface Callbacks {
        public abstract void setCurrentContentFragment(ContentFragment contentFragment);
    }

    protected Callbacks mCallbacks;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
    }

    @Override
    public void onStart() {
        super.onStart();
        mCallbacks = (Callbacks)getActivity();
        mCallbacks.setCurrentContentFragment(this);
    }

    @Override
    public void onStop() {
        super.onStop();
        mCallbacks = null;
    }

    public boolean handleBackPressed() {
        return false;
    }
}

内容碎片a。java:

public abstract class ContentFragmentA extends ContentFragment {

    protected abstract void handleIconATouched();

    ...

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        if (menu.findItem(R.id.icon_a) == null) {
            inflater.inflate(R.menu.icon_a, menu);
        }
        super.onCreateOptionsMenu(menu, inflater);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == R.id.icon_a) {
            handleIconATouched();
            return true;
        } else {
            return super.onOptionsItemSelected(item);
        }
    }
}

BlankFragment.java:

public class BlankFragment extends LoggedInContentFragment {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(false);
    }
}

在主活动中。java:

...

private void addContentFragmentNotAddingTransactionToBackStackIfCurrentFragment(ContentFragment fragment, boolean clearBackStack) {

    // mCurrentContentFragment changes as the back stack is cleared, thus addToBackStack is calculated before the clearBackStack() step.
    boolean addToBackStack = (false == clearBackStack && (mCurrentContentFragment != null && fragment.getClass() != mCurrentContentFragment.getClass()));

    if (clearBackStack) {
        clearBackStack();
    }

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    if (addToBackStack) {
        ft.addToBackStack(null);
    }
    ft.replace(R.id.container, fragment);

    ft.commit();

    getSupportFragmentManager().executePendingTransactions();
}

public void clearBackStack() {
    while (getSupportFragmentManager().getBackStackEntryCount() > 0) {
        getSupportFragmentManager().popBackStackImmediate();
    }

    // This is the step I would like to avoid
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.replace(R.id.container, new BlankFragment());
    ft.commit();

    getSupportFragmentManager().executePendingTransactions();
}

...

共有1个答案

闻人博
2023-03-14

我解决了这个问题。这是碎片事务后堆栈的问题。我将添加到后堆栈的事务与未添加的事务混合在一起,这些事务导致后堆栈以意外的方式弹出,并阻止片段被正确删除,因此它们向操作栏添加了额外的图标。在这个问题中解释了这个问题。我采用的解决方案是这个。

 类似资料:
  • 问题内容: 我目前正在为我的应用程序实现主题支持,其中一部分是更改操作栏应用程序图标。选择“ Holo Light”时,我想使用深色图标。除了设置动作栏应用程序图标的部分以外,其他所有操作均通过该方法完成。我要使用的代码是: 我得到的错误是“这里没有这样的参考”。应该如何正确完成? 顺便说一句,我是那么没有动作吧Sherlock的东西。 问题答案: 您将操作栏扔在那里。返回的实例,然后您需要调用该

  • 我使用以下代码将图标添加到TreeItem中。使用Jfeniox库进行材质设计图标。当我点击tree项时,图标会随机出现在treeview列表的末尾,就像在Image中一样。

  • 设置: 我正在Xcode 5中处理一个显示一组文本字段的视图。为了在键盘出现时处理滚动,我使用滚动视图来放置我的文本字段。我正在使用自动布局。 问题: 我正在努力解决在运行时向滚动视图顶部添加额外空间的问题。就像一个插页被应用到我的滚动视图中,尽管我已经通过日志确认插页为零。 在我的viewDidLoad()方法实现中,我这样做是为了确认值。。。 输出: 在我的第一个文本字段上方添加的空格(ins

  • 我用的是bootstrap4。我想创建一个类似android的导航栏,在最左边有一个图标条。与导航栏右侧的图像和其他图标完全一致。 我试过应用ml auto、mx auto、mr auto、向右拉等等。没有任何东西能满足我的需要。 MX-汽车是不错的小屏幕。当汉堡菜单在那里的时候,它把纳巴品牌放在中心。然而,我需要一些在常规菜单存在时有效的东西。 我已经尝试了下面,但项目打破不同的手机屏幕大小。

  • 我想替换JOptionPane标题栏中的图标(因为它当前显示的是默认的Java咖啡标识)。 我尝试了以下操作: 它替换窗口中的图标,但不替换标题栏中的图标: 是否有任何方法可以改变标题栏中的图标,或者隐藏默认的Java图标,而不必实现JDialog类? 多谢了!托玛斯

  • 我使用的是Flatter,状态栏的设计是黑色的,状态栏的图标颜色必须是白色,那么如何在Flatter中更改状态栏图标的颜色?