2012-04-13 9 views
0

私のActionBar(実際にはActionBarSherlock)に、アクティビティがロードされている間にメニュー項目をアニメートしようとしています。私が持っているコードは、アクティビティが初めて作成されたときに動作しますが、アクティビティが再び呼び出されたときはonCreateの後にonCreateOptionsMenuが呼び出されるため、 "loadingItem"でNullReference例外が発生します。私はonPrepareOptionsMenuを使ってみましたが、同じことです。メニュー項目をアニメーション化する

public class MyActivity extends SherlockActivity { 
    private MenuItem loadingItem; 

    @Override 
    public void onCreate(final Bundle icicle) 
    { 
     final LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     final ImageView ivRefresh = (ImageView)inflater.inflate(R.layout.refresh_view, null); 

     final Animation rotation = AnimationUtils.loadAnimation(this, R.anim.refresh); 
     ivRefresh.startAnimation(rotation); 
     loadingItem.setActionView(ivRefresh); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getSupportMenuInflater().inflate(R.menu.my_menu, menu); 
     loadingItem = menu.findItem(R.id.loading); 
     return super.onCreateOptionsMenu(menu); 
    } 
} 

my_menu.xml

<?xml version="1.0" encoding="UTF-8"?> 

<menu xmlns:android="http://schemas.android.com/apk/res/android"> 

    <item android:id="@+id/loading" 
      android:icon="@drawable/loading" 
      android:showAsAction="always"   
    /> 

</menu> 

アップデート:私は達成しようとしているものを最終的に

これ。私はWebViewのを持っていると私はWebViewのは、読み込みが完了するまでのローディングアイコンを表示したい:

@Override 
    public void onCreate(final Bundle icicle) 
    { 
     WebView webView = (WebView)findViewById(R.id.webview); 
     webView.getSettings().setSupportZoom(true); 
     webView.getSettings().setBuiltInZoomControls(true); 

     webView.loadUrl("http://www.google.com"); 

     webView.setWebViewClient(new WebBrowserClient()); 

     final LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     final ImageView ivRefresh = (ImageView)inflater.inflate(R.layout.refresh_view, null); 

     final Animation rotation = AnimationUtils.loadAnimation(this, R.anim.refresh); 
     ivRefresh.startAnimation(rotation); 
     loadingItem.setActionView(ivRefresh); 

     webView.setWebChromeClient(new WebChromeClient() { 
      public void onProgressChanged(WebView view, int progress) { 

       if (!isFinishing() && progress == 100 && loadingItem != null && loadingItem.getActionView() != null) 
       { 
        loadingItem.getActionView().clearAnimation(); 
        loadingItem.setActionView(null); 
       } 
      } 
     }); 
    } 
+0

いつアニメーションを実行しますか?常に?特定のイベントでは?作成するには? –

+0

私は自分のしていることを明確にすべきである私のOPにさらにコードを追加しました。 –

答えて

2

onCreateOptionsMenuは常にonCreate後に呼び出されます。実際には、onCreatealwaysとなり、アクティビティが作成されたときに呼び出される最初のメソッドになります。

変数を使用する前にloadingItem変数を割り当てるか、アクティビティが破棄されたときに参照が削除されないように静的宣言する必要があります(この場合でも最初のオプションが推奨されます)。

なぜアニメーションをonCreateOptionsMenuに設定しないのですか?

+0

私は調査しましたが、onCreateOptionsMenuとonPrepareOptionsMenuの外のメニュー項目にloadingItemを割り当てる方法を調べることができませんでした。また、私は私のコードをブレークポイントonCreateOptionsMenuは、私が何か間違っていない限り、最初にアクティビティが作成されたときにonCreateの前に呼び出されます。 –

+0

@Kris、なぜonCreateOptionsMenu'でアニメーションを開始しないのですか?あなたはとにかくそれが膨張されるまでそれが走っている必要はありません。 –

+0

ああ、すみません、私は自分自身を混乱させています。 onCreateOptionsMenuの前にonCreateが呼び出されています。最初のアクティビティ作成時にのみ作成されます。 onCreateが最初に呼び出された場合、アニメーションをonCreateOptionsMenuに追加することは役に立ちません。 –

関連する問題