2015-10-13 59 views
1

我正嘗試在菜單的可見性模式之間進行動畫。 默認情況下,所有菜單項都是隱藏的,但當用戶點擊編輯按鈕時,我想用動畫顯示所有項目。可見性模式之間的動畫對於菜單項

我已經實現了改變菜單項的可見性的第一部分,並且工作正常,但動畫部分使應用程序崩潰。

這是我的代碼。

當用戶點擊編輯這稱爲。默認edit_mode爲false。

if (!edit_mode) { 
    edit_mode = true; 
    supportInvalidateOptionsMenu(); 
} 

這是菜單代碼。

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.menu_add__custom, menu); 
    return true; 
} 

@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 

    MenuItem photo = menu.findItem(R.id.photo); 
    photo.setVisible(edit_mode); 
    if (edit_mode) 
     photo.getActionView().animate().alpha(1.0f); 

    MenuItem date = menu.findItem(R.id.date); 
    date.setVisible(edit_mode); 
    if (edit_mode) 
     date.getActionView().animate().alpha(1.0f); 

    MenuItem done = menu.findItem(R.id.done); 
    done.setVisible(edit_mode); 
    if (edit_mode) 
     done.getActionView().animate().alpha(1.0f); 

    return edit_mode; 
} 

menu.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/date" 
    android:icon="@drawable/ic_event_white_24dp" 
    android:orderInCategory="200" 
    android:title="Date" 
    app:showAsAction="ifRoom" /> 

<item 
    android:id="@+id/done" 
    android:icon="@drawable/ic_done_white_24dp" 
    android:orderInCategory="300" 
    android:title="Done" 
    app:showAsAction="ifRoom" /> 

<item 
    android:id="@+id/photo" 
    android:icon="@drawable/ic_photo_white_24dp" 
    android:orderInCategory="100" 
    android:title="Done" 
    app:showAsAction="ifRoom" /> 

回答

1

我相信你有那一聲有沒有因爲NullException通過getActionView()拋出。首先,通過這種方式設置動畫,您在onCreateOptionMenu()期間首先設置了動作視圖。這樣,當你得到onPrepareOptionsMenu中的actionView時,它不會因爲這個而崩潰,然後你就可以對它進行動畫處理。當您按下菜單按鈕時,onPrepareOptionsMenu會執行,以便您的邏輯在當時動畫正確。

如果它只是文本要在菜單項來顯示的話,應該是這樣,

final MenuItem photo; 

@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.menu_my_report, menu); 
     photo = menu.findItem(R.id.action1); 
     TextView textView = new TextView(this); 
     textView.setText("I am menu item"); 
     photo.setActionView(textView); 
     return true; 
    } 
    @Override 
    public boolean onPrepareOptionsMenu(Menu menu) { 
if(someCondition) 
{ 
     photo.getActionView().animate().alpha(1.0f); 
} 
     return super.onCreateOptionsMenu(menu); 
    } 

如果你想有一個複雜的自定義文本可以使用layoutInflator服務設置。這可能會去你的onCreate

LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     ImageView view = (ImageView)inflater.inflate(R.layout.some_view, null); 
     Animation rotation = AnimationUtils.loadAnimation(this, R.anim.fade); 

onCreateOptionMenu

view.startAnimation(rotation); 
     photo.setActionView(view); 

它只是讓你一個想法是什麼需要做,你可以玩這個,並且可以根據您的需要。

+0

我已經更新了問題,以顯示menu.xml文件。每個菜單項是一個圖標,我隱藏和顯示圖標,所以我仍然需要使用textview,或者我應該使用imageview,如果是的我需要改變嗎? –

+0

你可以使用圖像視圖,你可以infalte和使用layoutInflator服務佈局。看到我上面的答案,這部分也解釋了。嘗試實施它 –