2012-08-08 44 views
2

当用户按下ActionBar上的图标时,我正在更新SQLite数据库中的记录。正在更新的信息是一个将记录添加到“收藏夹”页面的标志。根据条件更改ActionBar中的图标

问题

当用户添加或删除记录在您的收藏,我想在ActionBar的图标更改。我有一个完整的星形图标和一个空的星形图标。

setIcon方法显示如果记录是收藏夹时的完整星形图标,如果记录不是收藏夹,则显示空星形图标。

在下面的代码中,您将看到我使用的是boolean isInFavourite,这是true,当String fav = "y"时。

当输入Activity时,显示的icon是正确的。

当用户单击icon来调用onMenuItemClick()方法时,记录已成功更新,但icon不会更改。

我无法改变boolean 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为解决

SOLUTION

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_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"/> 

回答

7

最简单的方法是只提供两个不同的按钮和隐藏/显示相应的他们:

@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是从哪里来的)

invalidateOptionsMenu(); 
+0

我需要让我的自己的XML文件的菜单项的当前状态的全局变量? – tiptopjat 2012-08-08 07:09:39

+0

不一定,你可以按照你一直这样做的方式来做,而不是膨胀它在飞行中创建它。这就是说,XML更清洁。 – dmon 2012-08-08 14:04:40

+0

试图使用您的解决方案。什么方法应该有我的数据库逻辑?我发现使用java而不是xml创建菜单更容易。 – tiptopjat 2012-08-08 22:52:29

1

充分利用isInFavourite变量全球f (在类中声明它,只在类中声明)。任何局部变量必须是最终的,以便它们在它们下面使用它们。但是,如果您将其全球化并在上面声明,则不必是最终的。