2012-08-08 5 views
2

사용자가 ActionBar의 아이콘을 누르면 SQLite 데이터베이스의 레코드가 업데이트됩니다. 업데이트되는 정보는 즐겨 찾기 페이지에 레코드를 추가하는 플래그입니다.조건에 따라 ActionBar의 아이콘 변경

사용자가 추가하거나 즐겨 찾기 기록을 제거 문제

, 나는 변경할 ActionBar에있는 아이콘을 싶습니다. 풀 스타 아이콘과 빈 별 아이콘이 있습니다.

setIcon 방법은 레코드가 즐겨 찾기 인 경우 전체 별 아이콘을 표시하고 레코드가 즐겨 찾기가 아닌 경우 빈 별 모양의 아이콘을 표시합니다.

아래 코드에서 나는 입니다. true 인 경우 String fav = "y"입니다.

Activity을 입력하면 icon이 올바르게 표시됩니다.

icon 메서드를 호출하기 위해 사용자가 메서드를 호출하면 레코드가 성공적으로 업데이트되지만 icon은 변경되지 않습니다.

나는 이클립스는 모든 변수가 누군가가 나에게 한 번 레코드가 업데이트되었습니다 할 수있는 아이콘을 변경할 수 있도록 할 수 final

로 설정하고 싶어하기 때문에 레코드가 업데이트되었을 때 boolean isInFavourite를 변경할 수 없습니다입니다. 고해상도/메뉴/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

가장 쉬운 방법은 두 가지 버튼을 제공하고 숨기기/적절하게 보여주는 것입니다. 당신이

invalidateOptionsMenu(); 
+0

나는 메뉴 항목에 대한 내 자신의 XML 파일을 확인해야합니다 (isFave가에서 오는) 항목의 현재 상태를있는 전역 변수가 있어야합니다? – tiptopjat

+0

필연적으로, 그것을 팽창시키는 대신에 그것을하고있는 방식대로 할 수 있습니다. 즉, XML은 훨씬 깨끗합니다. – dmon

+0

솔루션을 사용하려고합니다. 어떤 방법으로 데이터베이스 로직을 작성해야합니까? 나는 xml보다는 자바를 사용하여 메뉴를 만드는 것이 더 쉽다는 것을 알았다. – tiptopjat

1

isInFavourite합니다

@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; 

} 

덕분에 솔루션

솔루션

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 파일에 대한 @dmon하기 변수 a 전역 f ield (메서드 외부에서 클래스 내에서 선언하십시오.) 모든 지역 변수는 그 범위를 사용하기 위해 최종 범위 여야합니다. 그러나, 당신이 그것을 세계화하고 그것을 위에 선언한다면, 그것은 최종일 필요가 없다.

@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; 
} 

그런 다음 당신은 옵션 메뉴를 무효화 상태가 변경되었을 때 :

관련 문제