2012-06-13 54 views
49

Tôi có một Activity trong đó có một ActionBar nhưng tôi cần phải thay đổi các biểu tượng trên ActionBar động, tôi có một tạm dừng chơi nút và tôi cần phải thay thế nút chơi với nút tạm dừng khi người dùng nhấp vào nút đó. Tôi đã tìm kiếm và tôi thấy nó:Thay đổi biểu tượng trong ActionBar động

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    if(DEBUG) Log.i("onCreateOptionsMenu()", "onCreateOptionsMenu() -> LogicAnalizerView"); 
    //menu.add("").setIcon(R.drawable.pause).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.actionbarlogic, menu); 
    menu.removeItem(R.id.pauseLogic); 

    return true; 
} 

Vì vậy, bằng cách này tôi loại bỏ các nút Pause và tôi có thể thêm nó quá, nhưng nó chỉ xảy ra khi tôi bắt đầu ActivityActionBar được rút ra. Làm thế nào tôi có thể bắt buộc vẽ lại ActionBar? Ngoài ra, theo cách này, toàn bộ ActionBar được vẽ lại. Có đúng không? Có cách nào để vẽ lại chỉ nút/biểu tượng mà tôi muốn không?

Cảm ơn bạn :)

+7

http://developer.android.com/guide/topics/ui/menus.html - Liên kết này thực sự có mục "thay đổi các mục trình đơn khi chạy"! – trumpetlicks

+1

Cảm ơn bạn nó đã làm việc một cách hoàn hảo và có vẻ như đúng cách để làm điều đó :) – Andres

Trả lời

44

Bạn sẽ phải lưu tham chiếu đến MenuItem sau khi thực hiện lạm phát. Vì vậy, một cái gì đó như sau:

public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.actionbarlogic, menu); 
    playMenu = menu.findItem(R.id.playMenu); 
    updatePlayStatus(); 
    return menu; 
} 

public void updatePlayStatus() { 
    if(playService.isConnected()) { 
     playService.isPlaying() ? playMenu.setIcon(R.drawable.pause) : playMenu.setIcon(R.drawable.play); 
    } 
} 

Sau đó, bạn có thể tham khảo playMenu bất cứ lúc nào. Vì vậy, bạn có thể sửa đổi mục như nói rằng người chơi của bạn kết thúc chơi và nên quay trở lại biểu tượng phát.

+1

Cảm ơn bạn nhưng tôi nhận được nó làm việc whit liên kết của các nhà phát triển Android :) – Andres

+0

playService là gì? –

+0

@NeonWarge Đó là mã riêng của anh ấy. Chỉ cần bỏ qua nó. Bạn chỉ phải tập trung vào 'playMenu'. – chjarder

9
private Menu mMenu; 

@Override 
public boolean onCreateOptionsMenu(Menu menu) 
{ 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_main_activity, menu); 

    // Save the menu reference 
    mMenu = menu; 
    return super.onCreateOptionsMenu(menu); 
} 

// For example - Call when you need to change icon 
private void setActionIcon(boolean showWithBadge) 
{ 
    MenuItem item = mMenu.findItem(R.id.ITEM_ID); 

    if(mMenu != null) 
    { 
     if(showWithBadge) 
     { 
      item.setIcon(R.drawable.IC_WITH_BADGE);   
     } 
     else 
     { 
      item.setIcon(R.drawable.IC_WITHOUT_BADGE); 
     } 
    } 
} 
2

Ghi đè onPrepareOptionsMenu trong lớp hoạt động của bạn và sau đó bạn có thể thêm/xóa hoặc hiển thị các mục menu ẩn.

15

Thay vì xóa chúng, bạn chỉ có thể ẩn nút bạn không muốn hiển thị.

Ví dụ:

private boolean isPlaying; 
MenuItem mPlayMenuItem; 
MenuItem mPauseMenuItem; 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu items for use in the action bar 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.actionbarlogic, menu); 

    mPlayMenuItem = menu.findItem(R.id.action_play); 
    mPauseMenuItem = menu.findItem(R.id.action_pause); 

    return super.onCreateOptionsMenu(menu); 

} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    switch (item.getItemId()) { 
     case R.id.action_play: 
      isPlaying = true; 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
       this.invalidateOptionsMenu(); 
      } 
      return true; 
     case R.id.action_pause: 
      isPlaying = false; 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
       this.invalidateOptionsMenu(); 
      } 
      return true; 
     default: 
      return super.onOptionsItemSelected(item); 
    } 
} 


@Override 
public boolean onPrepareOptionsMenu (Menu menu) { 
    super.onPrepareOptionsMenu(menu); 

    if (isPlaying) { 
     mPlayMenuItem.setVisible(false); // hide play button 
     mPauseMenuItem.setVisible(true); // show the pause button 
    } else if (!isPlaying) { 
     mPlayMenuItem.setVisible(true); // show play button 
     mPauseMenuItem.setVisible(false); // hide the pause button 
    } 

    return true; 
} 

Chỉ cần một lưu ý, đây:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
    this.invalidateOptionsMenu(); 
} 

là cần thiết để cập nhật thanh hành động. Sau 3.0 thiết bị, thanh tác vụ không tự động cập nhật. Vì vậy, bạn phải tự nói với nó để gọi "OnPrepareOptionsMenu (Menu)" để nó sẽ làm mới các mục bằng cách gọi "Activity.invalidateOptionsMenu()".

Hy vọng điều này sẽ hữu ích!

tham khảo: http://developer.android.com/reference/android/app/Activity.html#onPrepareOptionsMenu(android.view.Menu)

http://developer.android.com/reference/android/support/v4/app/ActivityCompat.html#invalidateOptionsMenu(android.app.Activity)

2

Nếu bạn muốn để có được những mục đầu tiên từ thực đơn của bạn, **

use menu.getItem(0);

woks Bộ luật này một cách hoàn hảo:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.my_menu, menu); 
     MenuItem m = menu.getItem(0); 
     m.setIcon(R.drawable.your_icon_here); 
    } 


    return true; 
} 
Các vấn đề liên quan