2011-12-23 87 views
39

我打算在我的应用程序中使用快速操作UI模式。 Android Quick Actions UI Pattern。快速操作窗口需要一个枢轴视图来坚持。Android:获取视图参考菜单项

quickAction.show(View pivotView); 

我打算使用菜单项的快速操作,我可以访问被点击的项目。 但问题是我需要从菜单项引用视图,以便我可以将它传递给快速操作。

我如何获得对所选menuItem中的视图的引用。

+0

http://www.londatiga.net/it/how-to-create-quickaction-dialog-in-android/你有没有使用过这个链接.. – 2011-12-23 09:34:35

+0

@NikhilreddyGujjula链接不工作。 – 2011-12-23 09:40:25

+0

回复我已经试过它已经为我工作,但我没有代码为我的sry .. – 2011-12-23 09:45:53

回答

76

您可以通过在xml中为您的菜单项提供一个actionViewClass属性来实现此目的,然后您将能够获得需要的透视视图。该代码会是这样的

<item 
    android:id="@+id/menu_find" 
    android:showAsAction="ifRoom" 
    android:actionViewClass="android.widget.ImageButton" 
    /> 

在你OnCreateOptionsMenu为此

public boolean onCreateOptionsMenu(Menu menu) { 
    super.onCreateOptionsMenu(menu); 
    getMenuInflater().inflate(R.menu.menu_search, menu); 
    locButton = (ImageButton) menu.findItem(R.id.menu_find).getActionView(); 
    locButton.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      createPopup(); 
      mQuickAction.show(v); 
     } 
    }); 
    return true; 
} 
+0

非常感谢!我有一个奇怪的问题,其中取景器会在Android 4.1上找到操作栏中的spiner,但在4.2上它只返回null,这解决了它。 – PSIXO 2013-06-26 15:55:52

+0

setOnMenuItemClickListener对我有帮助,如果您想使用菜单项 – AnkitRox 2015-10-28 06:23:17

+11

执行直接操作,如果使用最近的库,请使用app:actionViewClass。 (res-auto) – 2016-05-03 10:04:19

28

老问题,但我跑进与actionViewClass属性的一些问题。对于后来遇到此问题的人...

调用findViewById(R.id.mnu_item)onOptionsItemSelected将返回一个View定位点。

QuickActionsMenuItems不是很好的设计,但我发现它们是用自定义背景实现子菜单的最简单方法。

+0

我猜你需要点击'menuItem'至少一次,然后才能得到'menuItem''view'anchor。 – Leebeedev 2015-02-19 20:18:01

+0

对,'findViewById()'调用必须在运行时完成 – loadedion 2015-02-19 21:55:45

+0

谢谢@ASH答案失败,如果我们把actionViewClass。这很好。 – iabhi 2016-05-26 15:41:46

1

任何想要查找其他原因(如我想要的)的菜单视图项目的更新。

如果您有权访问和使用AppCompat的工具栏,则有一种方法。这不是最有效的方式,但它是我发现访问菜单项视图的最简单方法。

public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
    Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar); 

    // Find Menu 
    for (int toolbarChildIndex = 0; toolbarChildIndex < toolbar.getChildCount(); toolbarChildIndex++) { 
     View view = toolbar.getChildAt(toolbarChildIndex); 

     // Found Menu 
     if (view instanceof ActionMenuView) { 
      ActionMenuView menuView = (ActionMenuView) view; 

      // All menu items 
      for (int menuChildIndex = 0; menuChildIndex < menuView.getChildCount(); menuChildIndex++) { 
       ActionMenuItemView itemView = (ActionMenuItemView) menuView.getChildAt(menuChildIndex); 
       // Do something to itemView... 
      } 
     } 
    } 
} 
1

在主要活动类中,最好重写onOptionsItemSelected(...)方法;应该是如下:

public boolean onOptionsItemSelected(MenuItem item) { 
    // the id is of type int 
    int someId = item.getItemId(); 
    // can use an if() or switch() statement to check if id is selected 
    //a Toast message can be used to show item is selected 
} 
1

中序到得到的菜单项的参考意见,我们需要这样做,

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.section, menu); 

    new Handler().post(new Runnable() { 
     @Override 
     public void run() { 

      final View menuItemView = findViewById(R.id.action_preview); 
      // SOME OF YOUR TASK AFTER GETTING VIEW REFERENCE 

     } 
    }); 


    return true; 
} 
0

你可以参考菜单项是这样的:

MenuItem btnFavorites = menu.findItem(R.id.action_favorite); 

然后做任何你想要的。例如。改变它的图标是这样的:

btnFavorites.setIcon(R.drawable.ic_favorite_false); 
1

的onOptionsItemSelected里面只是简单地通过使用ID获取视图。

查看menuItemView = findViewById(R.id。action_sort);

现在您可以根据您的需求使用此视图。