2015-12-03 37 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; 
      } 
     } 
    ); 
}