2012-11-12 10 views
17

私はアクションバーのメニュー項目にアンカーしたいが、クリックしたい項目のViewにあるとは思えない、PopupWindowがある。 これは、PopupWindowshowAsDropDown()メソッドに必要です。アクションバーのメニュー項目からビューを取得

これを達成する方法を知っている人はいますか?

答えて

35

あなたは... onOptionsItemSelectedでそれを取得することで、メニュー項目のIDを使用してビューを取得することができます

findViewById(R.id.menu_item); 
+1

これは機能しません。まず最初に試したところ、nullポインタが返されました。しかし、私はアクションバーの項目がViewではないようなMenuItemであるため、とにかくそれを期待しません。だから、私はそのMenuItem内のビューに取得しようとしています – Kyros

+0

は、あなたがそれをあなたのポップアップウィンドウに渡すために、アクティビティ内でそれを呼び出す必要があります。私のために働いています – Nermeen

+0

私はOnCreateで表示、どこで呼びますか? – Kyros

32

findViewByIdは、アクションアイテムのビューを取得するために、onOptionsItemSelected上で実行する必要はありません。

ただし、アクション項目がオーバーフローメニューの内側になることがあるため、代わりにnullが返されることがあることに注意してください。

だから、どうすればいいですか?

は、ここではサンプルコードです:

アンドロイド4.1.2とAndroid 2.3.5に、actionBarSherlockライブラリを使用している場合、これは試験した
public boolean onCreateOptionsMenu(final Menu menu) { 
    getSupportMenuInflater().inflate(R.menu.main, menu); 
    new Handler().post(new Runnable() { 
    @Override 
    public void run() { 
     final View menuItemView = findViewById(R.id.menu_action_item); 
     ... 

さらに別の方法は、showcaseView libraryhereで使用されているより広範な方法を使用することです。

+0

サードパーティのライブラリを使用せずにそれを行う良い方法を知っていますか? –

+0

はい、actionBarSherlockを使わずに同じことをします。私がテストしたものこのライブラリは、アンドロイドバージョンが3.0以上の場合の通常のネイティブアクションバーを表示します。 –

+8

これを使用すると、ヌルビューが表示されます。 – ingsaurabh

-1

毎週どこコール:

activity.findViewById(R.id.menu_item); 

フラグメント内部のコードが使用していない場合:

getView().findViewById(R.id.menu_item); 

それはヌルを返します。私もこの問題を満たす

+0

は機能しません。 ger reference null –

1

、findViewByIdは私の側で働いていたしなければならない、ここでのサンプルコードは次のとおりです。メニュー項目は、「ビューはそれほど膨らまされていないよう

private void setDrawable(final Menu menu) { 
    if (menu == null || menu.size() == 0) return; 

    Utils.postToUiHandler(new Runnable() { 
     @Override 
     public void run() { 
      int size = menu.size(); 
      for (int i = 0; i < size; i++) { 
       MenuItem menuItem = menu.getItem(i); 
       if (menuItem != null) { 
        View view = activity.findViewById(menuItem.getItemId()); 
        if (view != null) { 
         Drawable drawable = ThemeDrawables.get(ThemeWorker.Segment.DEFAULT).actionbarButton(); 
         if (drawable != null && view.getBackground() != drawable) { 
          int sdk = android.os.Build.VERSION.SDK_INT; 
          if (sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) { 
           view.setBackgroundDrawable(drawable); 
          } else { 
           view.setBackground(drawable); 
          } 
         } 

        } 
       } 
      } 
     } 
    }); 

} 

注意してください、私はUIスレッドでfindViewByIdを作ります がUIスレッドで実行されている必要があります

関連する問題