2017-02-18 4 views
1

私はこの単純なAndroidアプリケーションを開発中です。私はアクションバーに3つのメニューアイテムを持っており、それぞれのメニューアイテムは3つの異なるフラグメントをクリックすると膨らみます。アクションバーメニューアイテムアイコンを変更するAndroidスタジオで押したとき

私の質問:メニュー項目の1つをクリックすると、そのメニュー項目のアイコンがドロワブルフォルダの別のアイコンに変わり、別のメニュー項目をクリックして最初のものに変わるまでアイコンをクリックする前に

"state_pressed"でセレクタ.xmlを使用しようとしましたが、メニュー項目をクリックするとアイコンが1秒間変更されますが、クリックをやめるとすぐに最初のアイコンに戻ります。以下の関連コードを見つけることができます。あなたが私にこのことを手伝ってもらえれば幸いです。

submenu.xml(アクションバーのメニュー):

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" > 
    <item 
     android:id="@+id/action_todo" 
     android:title="" 
     android:icon="@drawable/action_bar_selector" 
     app:showAsAction="always" /> 
</menu> 

action_bar_selector.xml

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item 
     android:drawable="@drawable/ic_check_box_white_24dp" 
     android:state_pressed="true" /> 
    <item 
     android:drawable="@drawable/ic_check_box_white_24dp_unpressed" /> 
</selector> 

ProjectTodo.java(フラグメントクラスでアクションバーを膨らませます) :

public void onCreateOptionsMenu(Menu menu, MenuInflater inflater){ 
    inflater.inflate(R.menu.submenu, menu); 
} 

public boolean onOptionsItemSelected(MenuItem item){ 
    int id = item.getItemId(); 
    if(id == R.id.action_back){ 
     ProjectDetails frag = new ProjectDetails(); 
     ProjectMainListFragmentChanger fragInterface = (ProjectMainListFragmentChanger) getActivity(); 
     fragInterface.projectMainListChangeFragment(frag); 
     return false; 
    } 

    if(id == R.id.action_details){ 
     return true; 
    } 

    if(id == R.id.action_todo){ 
     ProjectDetails frag = new ProjectDetails(); 
     ProjectTodoFragmentChanger fragInterface = (ProjectTodoFragmentChanger) getActivity(); 
     fragInterface.projectTodoChangeFragment(frag);  
     return false; 
    } 
    return super.onOptionsItemSelected(item); 
} 

現在のアプリケーションのクイック.gifイメージが表示されます。私は、メニュー項目をクリックすると、それだけで第二のために第二のアイコンに変わり、その後、元のアイコンに行く:

enter image description here

+1

アクティビティごとにアクションバーが1回作成されます。アクションバーで何かを変更する必要があるときは、アクションバーを無効にする必要があります。だから、アイコンをクリックするたびにメニュー項目を再膨張させ、アクションバーを無効にしてください –

答えて

1

あなただけのアイテムを切り替えたい場合は、onOptionsItemSelectedを使用して行うことができますおよびonPrepareOptionsMenu

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    boolean result = true; 
    switch (item.getItemId()) { 
     case R.id.menu_details_save_toggle: 
      if (mIsSaved) { //you could modify this to check the icon/text of the menu item 
       mIsSaved = false; 
      } else { 
       mIsSaved = true; 
      } 
      invalidateOptionsMenu(); //cause a redraw 
      break; 
     default: 
      result = super.onOptionsItemSelected(item); 

    } 
    return result; 
} 

@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 
    if (mIsSaved) { 
     //in production you'd probably be better off keeping a reference to the item 
     menu.findItem(R.id.menu_details_save_toggle) 
      .setIcon(R.drawable.action_saved_on) 
      .setTitle(R.string.action_unsave); 
    } else { 
     menu.findItem(R.id.menu_details_save_toggle) 
      .setIcon(R.drawable.action_saved_off) 
      .setTitle(R.string.action_save); 
    } 
    return super.onPrepareOptionsMenu(menu); 
} 
+0

返事ありがとうございました。だから、私はonPrepareOptionsMenu()メソッドを使用せずにセレクタxmlで簡単にしたいことを達成できません。 – barutto

+1

私はそれが可能ではないとは思わない。しかし、チェック可能なインターフェイスで作業することができます[この回答を見る](http://stackoverflow.com/a/31401146/984830) –

関連する問題