gpt4 book ai didi

android - 更改由 xml 布局制作的工具栏菜单上的菜单项

转载 作者:太空宇宙 更新时间:2023-11-03 13:44:56 25 4
gpt4 key购买 nike

所以我的应用程序中有这个工具栏,我想根据用户是否登录显示不同的菜单项。当用户登录或注销时,我想更新我的布局,现在是工具栏菜单来表示更改。但出于某种原因,我的菜单项根本没有被删除,所有菜单项始终可见,无论登录状态如何。

我的菜单项:

<menu
xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">

<item
android:id="@+id/action_add"
android:icon="@drawable/ic_action_add"
android:title="@string/action_add"
app:showAsAction="ifRoom"/>

<item
android:id="@+id/action_login"
android:icon="@drawable/ic_action_logged_out"
android:title="@string/action_log_in"
app:showAsAction="always"/>

<item
android:id="@+id/action_logout"
android:icon="@drawable/ic_action_logged_in"
android:title="@string/action_log_out"
app:showAsAction="always"/>
</menu>

第一个菜单项应该只对已登录的用户可见。而且我想这是不言自明的,但我只希望其中一个登录/注销按钮根据登录状态可见。

我的 Java 代码:

protected void initializeToolbar(){
myToolbar = (Toolbar) findViewById(R.id.my_toolbar);
menu = myToolbar.getMenu();
resetToolbarMenu();
myToolbar.setOnMenuItemClickListener(this);
}

private void resetToolbarMenu(){
menu.clear();
getMenuInflater().inflate(R.menu.menu, menu);
if(loginPrefs.getBoolean("login", false)) { //loginPrefs is reference to a SharedPreference object
menu.removeItem(1);
} else {
menu.removeItem(2);
menu.removeItem(0);
}
}

我有两种方法的原因是我只想设置一次工具栏和监听器,但我希望能够在用户每次登录/注销时更改菜单而无需重新加载页面。

成功登录后,resetToolbarMenu() 方法将再次被调用。

我想 menu.remove(0) 不会更新 UI,但是如果不先膨胀菜单对象然后从工具栏中获取它,我找不到另一种方法来访问我的菜单对象,并且我假设通货膨胀决定了哪些项目是可见的。基本上,我找不到一种方法在膨胀之前删除任何菜单项或以膨胀以外的其他方式更新 UI。

解决方案:

我把我的 java 代码改成了这样:

protected void initializeToolbar(){
myToolbar = (Toolbar) findViewById(R.id.my_toolbar);
setSupportActionBar(myToolbar);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu, menu);
return super.onCreateOptionsMenu(menu); // Don't know if this is necessary or if returning true is prefered.
}

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
if(loginPrefs.getBoolean("login", false)) {
menu.getItem(0).setVisible(true);
menu.getItem(1).setVisible(false);
menu.getItem(2).setVisible(true);
} else {
menu.getItem(0).setVisible(false);
menu.getItem(1).setVisible(true);
menu.getItem(2).setVisible(false);
}
return true;
}

我还必须在注销/登录时调用 invalidateOptionsMenu() 来更新工具栏/菜单。但是,只要您打开工具栏本身未显示的项目的菜单,也会自动调用 onPrepareOptionsMenu()。

PS:OnCreateOptionsMenuOnPrepareOptionsMenu 将不会被使用,除非你记得 setSupportActionBar(myToolbar) 因为我忘记了。

最佳答案

您可以通过覆盖 onCreateOptionsMenu 创建选项菜单。您可以创建 2 个 xml 并根据您的逻辑对其中之一进行膨胀。要强制重绘菜单,您可以调用 invalidateOptionsMenu

例如

@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
if (login) {
inflater.inflate(R.menu.login_menu, menu);
} else {
inflater.inflate(R.menu.logout_menu, menu);
}
return true;
}

并且在外面改变标志并强制重绘

login = false; // or true
invalidateOptionsMenu();

关于android - 更改由 xml 布局制作的工具栏菜单上的菜单项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44196771/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com