我设法解决了一个问题,即在片段事务后,操作栏中会出现一个额外的图标,但这是一个笨拙的解决方案,我想知道是否有更好的方法来解决它。
我有一个片段类层次结构,其中ContentFrament
是一个占据整个屏幕(除了动作栏)的抽象片段,它的子类提供了额外的动作栏图标(通过它们各自的onCreateOptionsMenu()
和onOptionsItemSelec()
方法)。例如ContentFragmentA
贡献有图标A
,ContentFragmentB
有图标B
,ContentFragmentB
可能是也可能不是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();
}
...
我解决了这个问题。这是碎片事务后堆栈的问题。我将添加到后堆栈的事务与未添加的事务混合在一起,这些事务导致后堆栈以意外的方式弹出,并阻止片段被正确删除,因此它们向操作栏添加了额外的图标。在这个问题中解释了这个问题。我采用的解决方案是这个。
问题内容: 我目前正在为我的应用程序实现主题支持,其中一部分是更改操作栏应用程序图标。选择“ 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中更改状态栏图标的颜色?