2015-12-03 38 views
1

Android工具栏菜单项显示吐司提示长按。 Toast消息在xml中用“title”属性定义:导航图标烤面包提示

<item 
    android:id="@+id/openRightMenu" 
    android:orderInCategory="300" 
    android:title="@string/navigation_drawer_right_desc" 
    android:icon="@drawable/menu24_2" 
    app:showAsAction="always" 
    /> 

我可以为工具栏的导航图标设置相同的行为吗?我把下面的代码

 toolbar.setNavigationIcon(R.drawable.locations_icon); 

的图标,但我不能在这里设置

+0

不知道我明白这个问题,但我想你会想为文本添加一个'textview',然后在代码中调用'textview.settext()'。看到这个答案http://stackoverflow.com/questions/19452269/android-set-text-to-textview – EnduroDave

+0

@Drdavidpier指这个问题http://stackoverflow.com/questions/26490126/appcompat-style-background-propagated工具栏中的图像到步骤2.有一个提示我在说 –

+0

我相信它必须在你的代码中完成。我不认为你可以为它设置任何XML属性。这可以接受吗? –

回答

1

的说明文字有我用得到Toolbar的导航按钮查看两种方式。第一个使用Toolbar类的反思,第二个使用Toolbar的孩子View s,直到找到ImageButton

反射方法:

private View getNavButtonView(Toolbar toolbar) { 
    try { 
     Class<?> toolbarClass = Toolbar.class; 
     Field navButtonField = toolbarClass.getDeclaredField("mNavButtonView"); 
     navButtonField.setAccessible(true); 
     View navButtonView = (View) navButtonField.get(toolbar); 

     return navButtonView; 
    } 
    catch (NoSuchFieldException | IllegalAccessException e) { 
     e.printStackTrace(); 
    } 

    return null; 
} 

而且迭代方法:

private View getNavButtonView(Toolbar toolbar) { 
    for (int i = 0; i < toolbar.getChildCount(); i++) 
     if (toolbar.getChildAt(i) instanceof ImageButton) 
      return toolbar.getChildAt(i); 

    return null; 
} 

请注意,如果您使用迭代法,应立即设置导航图标后调用,这应该在任何其他View被添加或设置在Toolbar之前被调用。

当我们得到View后,我们只需要设置一个OnLongClickListener,并用Toast显示一个合适的偏移量。例如:

toolbar.setNavigationIcon(R.drawable.ic_launcher); 
View navButtonView = getNavButtonView(toolbar); 

if (navButtonView != null) { 
    navButtonView.setOnLongClickListener(new OnLongClickListener() { 
      @Override 
      public boolean onLongClick(View v) { 
       Toast toast = Toast.makeText(v.getContext(), 
              "Navigation Button View", 
              Toast.LENGTH_SHORT); 

       int[] loc = new int[2]; 
       v.getLocationOnScreen(loc); 

       toast.setGravity(Gravity.TOP | Gravity.LEFT, 
           loc[0] + v.getWidth()/2, 
           loc[1] + v.getHeight()/2); 
       toast.show(); 

       return true; 
      } 
     } 
    ); 
}