Java 根据条件更改ActionBar中的图标
当用户按下Java 根据条件更改ActionBar中的图标,java,android,boolean,logic,android-actionbar,Java,Android,Boolean,Logic,Android Actionbar,当用户按下操作栏上的图标时,我正在更新SQLite数据库中的记录。正在更新的信息是一个将记录添加到收藏夹页面的标志 问题 当用户向收藏夹添加或删除记录时,我希望操作栏中的图标更改。我有一个全明星图标和一个空明星图标 setIcon方法显示全明星图标(如果记录是收藏夹),以及空明星图标(如果记录不是收藏夹) 在下面的代码中,您将看到我使用的是一个布尔值isInFavourite,当String fav=“y”时,它是true 当输入活动时,显示的图标是正确的 当用户单击图标调用onMenuItem
操作栏上的图标时,我正在更新SQLite数据库中的记录。正在更新的信息是一个将记录添加到收藏夹页面的标志
问题
当用户向收藏夹添加或删除记录时,我希望操作栏中的图标更改。我有一个全明星图标和一个空明星图标
setIcon
方法显示全明星图标(如果记录是收藏夹),以及空明星图标(如果记录不是收藏夹)
在下面的代码中,您将看到我使用的是一个布尔值isInFavourite
,当String fav=“y”
时,它是true
当输入活动时
,显示的图标
是正确的
当用户单击图标
调用onMenuItemClick()
方法时,记录将成功更新,但图标
不会更改
更新记录后,我无法更改布尔值isInFavourite
,因为Eclipse希望将所有变量设置为final
有人能帮我将图标更改为记录更新后的图标吗
@Override
public boolean onCreateOptionsMenu(Menu menu) {
db = new DBHelper(this);
db.createDataBase();
db.openDataBase();
Bundle bundle = getIntent().getExtras();
final String rowid = bundle.getString("id");
final String fav = bundle.getString("fav");
//Boolean to check if record is a favourite
final boolean isInFavourite = fav.contentEquals("y");
menu.add("Add to Favourites")
.setOnMenuItemClickListener(new OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
String toggle;
String message;
//Logic to add or remove row from recording.
if (isInFavourite) {
toggle = "n";
message = "Recipe removed from Favourites";
} else {
toggle = "y";
message = "Recipe added to Favourites";
}
//Update favourite record in database
db.updateFavourite(rowid, toggle);
db.close();
Toast.makeText(getApplicationContext(), message,
Toast.LENGTH_LONG).show();
return true;
}
})
//Set icon depending on whether record is a favourite or not.
.setIcon(isInFavourite ? R.drawable.fav_true : R.drawable.fav_false)
.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
return true;
}
感谢@dmon提供的解决方案
解决方案
private DBHelper db = null;
public String fav = null;
public String rowid = null;
public boolean isFav;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
Bundle bundle = getIntent().getExtras();
rowid = bundle.getString("id");
fav = bundle.getString("fav");
if (fav.contentEquals("y")) {
isFav = true;
} else {
isFav = false;
}
try {
db = new DBHelper(this);
db.createDataBase();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getSupportMenuInflater().inflate(R.menu.menu_settings, menu);
return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
MenuItem fave = menu.findItem(R.id.add);
MenuItem unfave = menu.findItem(R.id.remove);
fave.setVisible(isFav);
unfave.setVisible(!isFav);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
onBackPressed();
return true;
case R.id.add:
fav = "n";
isFav = false;
updateFav();
supportInvalidateOptionsMenu();
Toast("Removed from Favourites");
return true;
case R.id.remove:
fav = "y";
isFav = true;
updateFav();
supportInvalidateOptionsMenu();
Toast("Added to Favourites");
return true;
default:
return super.onOptionsItemSelected(item);
}
}
public void updateFav (){
db.openDataBase();
db.updateFavourite(rowid, fav);
db.close();
}
XML文件:res/menu/menu_settings.XML
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/add"
android:icon="@drawable/good"
android:showAsAction="always"
/>
<item
android:id="@+id/remove"
android:icon="@drawable/bad"
android:showAsAction="always"/>
将isInFavourite变量设置为全局字段(在方法外部声明,仅在类中声明)。任何局部变量都必须是最终的,在它们下面的范围内才能使用它们。但是,如果您将其设置为全局,并在上面声明,则它不需要是最终的。最简单的方法是只提供两个不同的按钮并相应地隐藏/显示它们:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inf = new MenuInflater(this);
inf.inflate(R.menu.menu_xml, menu);
return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
MenuItem fave = menu.findItem(R.id.favorite);
MenuItem unfave = menu.findItem(R.id.unfavorite);
fave.setVisible(!isFave);
unfave.setVisible(isFave);
return true;
}
然后,当状态更改时,将使选项菜单无效。请注意,您必须有一个全局变量,该变量具有项目的当前状态(其中isFave
来自)
我是否需要为菜单项创建自己的xml文件?不一定,您可以按照以前的方式来做,而不必膨胀它,而是动态创建它。也就是说,xml更干净。尝试使用您的解决方案。什么方法应该有我的数据库逻辑?我发现使用java而不是xml创建菜单更容易。嗯,如果我没有弄错的话,我会将您的db代码移动到您的onCreate
,它在onCreateOptionsMenu()
之前运行。将记录信息保存在类变量中,以便您可以在oncreateoptions菜单中使用它。
。使用您的解决方案使其正常工作!我已经将数据库逻辑添加到onOptionItemSelected()
方法中。我正在使用ActionBarSherlock。你知道invalidateOptions菜单()
对Froyo和姜饼是否有效吗?
invalidateOptionsMenu();