2013-03-10 91 views
11

我在android中构建一个弹出菜单,我需要在每个菜单项中存储一些ID。 这些ID是String,因此如果我可以将一个String数组设置为MenuItem,那将会很不错。如何将标签设置为MenuItem?

问题是MenuItem没有setTag方法。

我还能如何将一些数据附加到它?

编辑: 有关getActionView();

不幸的是它返回null。

但是,它是保存以下操作吗?

View view = new View(getActivity()); 
view.setTag(tag); 
menuItem.setActionView(view); 

回答

11

每个MenuItem具有相关联的View称为的ActionView。如果您使用的是自定义ActionView,则可以使用MenuItem.getActionView()来获取它,并在其上设置/检索标签。

例如,设置标签:如果你没有使用自定义的ActionView

public void setMenuItemTag(MenuItem item, Object tag) 
{ 
    View actionView = item.getActionView(); 
    actionView.setTag(tag); 
} 

编辑

,你可以用一个HashMap来存储标签。使用MenuItem作为关键。

public void setMenuItemTag(MenuItem item, Object tag) 
{ 
    myMap.put(item, tag); 
} 

// returns null if tag has not been set(or was set to null) 
public Object getMenuItemTag(MenuItem item, Object tag) 
{ 
    return myMap.get(item); 
} 
+4

getActionView返回null。 – 2013-03-10 19:44:38

+0

啊。那么,在这种情况下,你可以设置一个'HashMap '。来存储它们。 – Geobits 2013-03-10 19:47:38

+0

使用'HashMap'或者当我添加到我的文章中时,它会更好吗? – 2013-03-10 19:51:00

0

黑客方式来设置标签时,不使用自定义视图。 这个想法非常简单,在创建实际视图后,我们试图通过它的文本和图标找到它

private void addButtonToMenu(Toolbar toolbar, Menu menu, String title, Drawable icon, String testId) { 
    MenuItem menuItem = menu.add(title); 
    if (icon != null){ 
     menuItem.setIcon(icon); 
    } 
    setTestId(toolbar, title, icon, testId); 
} 

private void setTestId(Toolbar toolbar, String title, Drawable icon, String testId) { 
    UiUtils.runOnPreDrawOnce(toolbar,() -> { 
     ActionMenuView buttonsLayout = ViewUtils.findChildByClass(toolbar, ActionMenuView.class); 
     List<TextView> buttons = ViewUtils.findChildrenByClass(buttonsLayout, TextView.class); 
     for (TextView view : buttons) { 
      if (!TextUtils.isEmpty(title) && title.equals(view.getText())) { 
       view.setTag(testId); 
      } else if (icon != null && ArraryUtils.containes(view.getCompoundDrawables(), icon)) { 
       view.setTag(testId); 
      } 
     } 
    }); 
} 

// Helper functions 

public class UiUtils { 

    public static void runOnPreDrawOnce(final View view, final Runnable task) { 
     view.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
      @Override 
      public boolean onPreDraw() { 
       view.getViewTreeObserver().removeOnPreDrawListener(this); 
       task.run(); 
       return true; 
      } 
     }); 
    } 
} 

public class ArrayUtils { 
    public static boolean contains(Object[] array, Object item) { 
     if (isNullOrEmpty(array)) return false; 
     for (Object o : array) { 
      if (o == item) return true; 
     } 
     return false; 
    } 

    private static boolean isNullOrEmpty(Object[] array) { 
     return array == null || array.length == 0; 
    } 
} 

public class ViewUtils { 
    @Nullable 
    public static <T> T findChildByClass(ViewGroup root, Class clazz) { 
     for (int i = 0; i < root.getChildCount(); i++) { 
      View view = root.getChildAt(i); 
      if (clazz.isAssignableFrom(view.getClass())) { 
       return (T) view; 
      } 

      if (view instanceof ViewGroup) { 
       view = findChildByClass((ViewGroup) view, clazz); 
       if (view != null && clazz.isAssignableFrom(view.getClass())) { 
        return (T) view; 
       } 
      } 
     } 
     return null; 
    } 

    public static <T> List<T> findChildrenByClass(ViewGroup root, Class clazz) { 
     List<T> ret = new ArrayList<>(); 
     for (int i = 0; i < root.getChildCount(); i++) { 
      View view = root.getChildAt(i); 
      if (clazz.isAssignableFrom(view.getClass())) { 
       ret.add((T) view); 
      } 
     } 
     return ret; 
    } 
} 
相关问题