我有一个收藏夹功能,用户可以在其中添加喜爱的食谱,然后将其删除。我在操作栏上有一个菜单项,可以执行这两个操作。我有两个不同的菜单。当显示配方页面的片段时,将执行检查以查看配方是否已经为用户所青睐。如果它已被优惠,则应显示“删除”图标,但如果没有,则应显示“添加到收藏夹”图标。
但是,当我测试加载一个受欢迎的食谱页面时,“添加到收藏夹”按钮显示如下:
但是当我切换到另一个标签然后切换回来时,会显示正确的删除图标。
为什么第一次尝试时没有显示正确的菜单?
IngredientsFragment.java
boolean exists;
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
menu.clear();
super.onCreateOptionsMenu(menu, inflater);
session = new SessionManager(getActivity());
new CheckFavourite().execute();
getExistence();
if (session.isLoggedIn()) {
if (exists){
inflater.inflate(R.menu.delete_from_favs, menu);
}
else {
inflater.inflate(R.menu.add_to_favs, menu);
}
}
restoreActionBar();
}
class CheckFavourite extends AsyncTask<String, String, String> {
private String user_id, recipe_id;
/**
* Before starting background thread Show Progress Dialog
* */
@Override
protected void onPreExecute() {
super.onPreExecute();
user_id = session.getID();
recipe_id = result.getRecipeId();
System.out.println("User ID: " + user_id);
System.out.println("recipe ID: " + recipe_id);
}
/**
* Checking favourites
* */
protected String doInBackground(String... args) {
// Building Parameters
HashMap<String, String> params = new HashMap<>();
params.put("user_id", user_id);
params.put("recipe_id", recipe_id);
// getting JSON Object
JSONObject json = jsonParser.makeHttpRequest("MyWebsiteURL",
"POST", params);
// check log cat for JSON response
Log.d("Create Response", json.toString());
// check for success tag
try {
int success = json.getInt(TAG_SUCCESS);
System.out.println(success);
if (success == 1) {
setTrue();
Log.d("Exist", json.toString());
} else {
setFalse();
Log.d("Does not exist", json.toString());
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
/**
* After completing background task Dismiss the progress dialog
* **/
protected void onPostExecute(String file_url) {
// dismiss the dialog once done
}
}
public boolean getExistence(){
return this.exists;
}
public void setTrue(){
exists = true;
}
public void setFalse(){
exists = false;
}
add_to_favs.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/favourites"
android:title="@string/action_example"
android:icon="@drawable/favourites"
app:showAsAction="withText|ifRoom">
</item>
</menu>
delete_from_favs.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/delete"
android:title="@string/action_example"
android:icon="@drawable/delete"
app:showAsAction="withText|ifRoom">
</item>
</menu>
我尝试了很多东西,将两个菜单项放在同一个菜单中,并将其中一个设置为可见/不可见。我也尝试使用onPrepareOptionsMenu
方法,但这导致了相同的结果。我知道我错过了一些愚蠢的东西。请帮忙!
答案 0 :(得分:0)
只需使用一个菜单并在其中包含两个项目....并以编程方式隐藏/显示它..
menu.xml(在您的活动中)
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/favourites"
android:title="@string/action_example"
android:icon="@drawable/favourites"
app:showAsAction="withText|ifRoom">
</item>
<item android:id="@+id/delete"
android:title="@string/action_example"
android:icon="@drawable/delete"
app:showAsAction="withText|ifRoom">
</item>
</menu>
创建视图内部
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
MenuItem fav = menu.findItem(R.id.favourites);
fav.setVisible(true);
MenuItem del = menu.findItem(R.id.delete);
del.setVisible(true);
}
//based on condition
if (session.isLoggedIn()) {
if (exists){
del.setVisibility(true);
fav.setVisibility(false);
}else{
fav.setVisibility(true);
del.setVisibility(false);
}
}
}