2

ユーザーがのアイコンを押したときに、SQLiteデータベースのレコードを更新していますActionBar。更新される情報は、お気に入りページにレコードを追加するフラグです。

問題

ユーザーがお気に入りにレコードを追加または削除したときに、のアイコンを変更したいと思いますActionBar。完全な星のアイコンと空の星のアイコンがあります。

このsetIconメソッドは、レコードがお気に入りの場合は完全な星のアイコンを表示し、レコードがお気に入りでない場合は空の星のアイコンを表示します。

以下のコードでは、私がを使用していることがわかります。boolean isInFavouriteこれは、のtrue場合String fav = "y"です。

を入力するActivityと、icon表示は正しいです。

ユーザーがをクリックしてメソッドiconを呼び出すonMenuItemClick()と、レコードは正常に更新されますが、iconは変更されません。

boolean isInFavouriteEclipseはすべての変数を次のように設定する必要があるため、レコードが更新された時期を変更できません。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"/>

4

2 に答える 2

7

最も簡単な方法は、2 つの異なるボタンを提供し、それに応じて非表示/表示することです。

@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();
于 2012-08-08T01:46:16.243 に答える
1

isInFavourite 変数をグローバル フィールドにします (クラス内でメソッドの外で宣言します)。ローカル変数は、その下のスコープで使用するために final でなければなりません。ただし、グローバルにして上記で宣言する場合は、final である必要はありません。

于 2012-08-08T01:44:43.040 に答える