2011-10-15 8 views
9

は私がフラグメント内部が、それは文脈活性よりコンテキストのアプリケーションを使用することをお勧めします、私はgetActivity()を使用することが怖いと言っ http://developer.android.com/resources/articles/avoiding-memory-leaks.html を読んだ後に、新たなオプションメニューを作成しています。()アクティビティから新しいmenuInflaterまたはgetMenuInflater()を作成しますか?

のでgetMenuInflaterを、実際にはこれより良い

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    MenuInflater mInflater = new MenuInflater(getActivity().getApplicationContext()); 
    mInflater.inflate(R.menu.simple_menu, menu); 
} 

または1つのコールアクティビティ

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    MenuInflater mInflater = getActivity().getMenuInflater(); 
    mInflater.inflate(R.menu.simple_menu, menu); 

} 

と、「日の両者の違いは何ですか?または両方が同じですか?

ありがとうございました。

答えて

13

非常に似ています。 MenuInflatorのソースを調べると、コンテキストを使用する唯一のことはリソースファイルにアクセスすることだけです。したがって、特定のコンテキストはMenuInfoには関係ありません。メモリリークについては

、あなたが参照する記事は

は、最も明白な[メモリリークを回避する方法は]あなたがない限り、独自のスコープ

の外 コンテキストを脱出避けるためであると言いますMenuInflator(またはMenu)を別のクラスに渡します。それはアクティビティに含まれ、リークされません。

EDIT

またActivity.getMenuInflator()new MenuInflator()ためだけに便利な方法です。

public MenuInflater getMenuInflater() { 
    return new MenuInflater(this); 
} 

彼らはあなたのコードを変更することなく、将来のバージョンで変更することが基本となる実装を可能とするため、便利なメソッドを使用することは通常より良いです:実際には、これはActivityクラス内のメソッドです。たとえば、毎回新しいメソッドを作成するのではなく、キャッシュされたインスタンスを返すように上記のメソッドを変更した場合などです。

あなたがそれを使用して仕上げていますが、なぜ必要なのと同じようにあなたができるだけ早く正常にあなたがそれを「忘れる」になるので、本当の違いはあり
ません(第2引数に気づく)メソッド public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)に渡され MenuInflaterインスタンスを使用する必要があります
+0

ええ、それはmenuInflater "取得" よりも多くのメモリを食べるようになるように "新しい" menuInflaterサウンドを作成... と私は、別のクラスにmenuInflatorを渡さないと、フラグメント化されたクラスではなくフラグメントクラス内で呼び出すので、私がgetMenuInflatorを呼び出すと "別のクラスからmenuInflatorを呼び出せません" ? –

+0

@ GAO-tsukaiこの方法についてご質問がありませんでした。それに応じて私の答えを更新しました。 – spatulamania

+0

ありがとう、今私は本当にアンドロイドのソースを見る必要があると感じる... –

1

あなたが既に引数から1つを持っている場合、それを作成するには?

0

このからの変更:これに

MenuInflater inflater = getMenuInflater(); 

MenuInflater inflater = getActivity().getMenuInflater(); 
関連する問題