6

我有一個使用SupportActionBar的應用程序。我喜歡一個行動的自定義視圖。Android ActionBar自定義操作視圖工具提示

事情是,當我長按時,默認動作顯示工具提示,但我的自定義動作沒有。

因此,這裏的默認操作(因爲你可以看到,有一個工具提示): Action item with tool-tip

這裏是我的自定義操作(無刀具前端爲這一個:/): enter image description here

的XML這些2:

<menu 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:custom="http://schemas.android.com/apk/res-auto"> 

     <item 
      android:visible="false" 
      android:title="Clear history" 
      android:id="@+id/action_clear_history" 
      custom:showAsAction="always" 
      android:icon="@drawable/ic_action_trash" /> 
     <item 
      android:title="Open chat" 
      android:id="@+id/action_chat" 
      custom:showAsAction="always" 
      custom:actionLayout="@layout/ab_chat" /> 
    </menu> 

有人能幫忙嗎?

+0

你得回答或不? @Arthur – 2014-11-05 07:44:01

+0

我會盡快發佈一個更新;)你需要知道的重點:D – Arthur 2014-11-05 10:24:55

+0

看到我的答案,其易於實現和工作我的結局 – Lokesh 2014-11-07 11:27:22

回答

9

我不認爲有這方面的任何「官方」 API調用。正如其他答案所暗示的,我相信在您的自定義視圖中添加一個View.OnClickListener即可。

然而,你可以做的更好一點,正確計算工具提示烤麪包的位置。我會建議簡單地複製和粘貼相關的片段從ActionMenuItemView類(從支持庫的源代碼),因爲它有一些特殊情況下交易:

@Override 
public boolean onLongClick(View v) { 
    if (hasText()) { 
     // Don't show the cheat sheet for items that already show text. 
     return false; 
    } 

    final int[] screenPos = new int[2]; 
    final Rect displayFrame = new Rect(); 
    getLocationOnScreen(screenPos); 
    getWindowVisibleDisplayFrame(displayFrame); 

    final Context context = getContext(); 
    final int width = getWidth(); 
    final int height = getHeight(); 
    final int midy = screenPos[1] + height/2; 
    int referenceX = screenPos[0] + width/2; 
    if (ViewCompat.getLayoutDirection(v) == ViewCompat.LAYOUT_DIRECTION_LTR) { 
     final int screenWidth = context.getResources().getDisplayMetrics().widthPixels; 
     referenceX = screenWidth - referenceX; // mirror 
    } 
    Toast cheatSheet = Toast.makeText(context, mItemData.getTitle(), Toast.LENGTH_SHORT); 
    if (midy < displayFrame.height()) { 
     // Show along the top; follow action buttons 
     cheatSheet.setGravity(Gravity.TOP | GravityCompat.END, referenceX, height); 
    } else { 
     // Show along the bottom center 
     cheatSheet.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, height); 
    } 
    cheatSheet.show(); 
    return true; 
} 

您可以在<android-sdk>\sources\android-21\android\support\v7\internal\view\menu找到它。

+0

不錯,謝謝! – Arthur 2014-11-09 22:15:04

0

由於您使用的按鈕自定義佈局,下面的代碼應該工作:

view.setOnLongClickListener(new OnLongClickListener() { 
    public boolean onLongClick(View view) { 
     Toast toast = Toast.makeText(v.getContext(), "Open chat", Toast.LENGTH_SHORT); 
     toast.show(); 
     return true; 
    } 
} 

只需設置本作中,操作欄按鈕的長按監聽。

0

嘗試添加帶有Text的值到showAsAction功能。這樣

android:showAsAction="ifRoom|always|withText" 
0

東西使用findItem方法上Menu得到你的意見,並在您的視圖設置您OnLongClickListener。在xml文件菜單的就是添加一行android:actionViewClass="android.widget.ImageButton"

一個變化(你可以改變View):

<item 
    android:title="Open chat" 
    android:id="@+id/action_chat" 
    custom:showAsAction="always" 
    android:actionViewClass="android.widget.ImageButton" 
    custom:actionLayout="@layout/ab_chat" /> 

願你在這裏得到錯誤讓你的父母View我覺得應該是你主視圖自定義佈局。與Gravity

@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // TODO Auto-generated method stub 
     getSupportMenuInflater().inflate(R.menu.menu_xml, menu); 
     /* 
     As per your defined view in XML of MENU 
     */ 
     ImageButton view = (ImageButton) menu.findItem(R.id.action_chat).getActionView(); 
     view.setOnLongClickListener(new OnLongClickListener() { 

      @Override 
      public boolean onLongClick(View arg0) { 
       // TODO Auto-generated method stub 
       Display display = getWindowManager().getDefaultDisplay(); 
       Point size = new Point(); 
       display.getSize(size); 
       int width = size.x; 
       Toast toast = Toast.makeText(context, "Open Chat", Toast.LENGTH_SHORT); 
       toast.setGravity(Gravity.TOP, width - 200, 50); //your width and height 
       toast.show(); 
       return false; 
      } 
     }); 

     return super.onCreateOptionsMenu(menu); 
    } 

顯示ToastTop

你可以看到:你可以用它先再使用後actionViewClass

現在onCreateOptionMenu()獲得長按事件Playing with Toast

+0

看起來有點哈克。爲什麼我需要'android:actionViewClass'? – Arthur 2014-11-05 10:26:13

+0

因爲它可以幫助你獲得任何'View'來控制你的'onLongPress'點擊事件。 – 2014-11-05 11:50:14

+0

好吧,實際上你不需要'androidLactionViewClass'去實現它。 'MenuItem item_chat = menu.findItem(R.id.action_chat);'沒有這個工作。然後我可以在操作視圖本身上放一個'onLongPress'監聽器'View item_chat_action_view = MenuItemCompat.getActionView(item_chat);'。 – Arthur 2014-11-05 12:39:04

0

創建自定義佈局和設置此操作欄上的佈局,我希望它可以爲你工作

View view  = getLayoutInflater().inflate(R.layout.actionbar_demo,null); 
    btn = (ImageView) view.findViewById(R.id.btn_action); 
    btn.setOnLongClickListener(new OnLongClickListener() 
    { 

     @Override 
     public boolean onLongClick(View v) { 

      return true; 
     } 
    }); 



    getActionBar() . setCustomView(view); 

,你也實現這樣的

ActionBar actionBar = getSupportActionBar(); 
      actionBar.setCustomView(R.layoutcustom_action_bar); 
      actionBar.setDisplayShowCustomEnabled(true); 
      mLogo = (ImageView) actionBar.getCustomView().findViewById(
        R.id.logo); 
      mLogo.setOnLongClickListener(new OnLongClickListener() 
       { 

        @Override 
        public boolean onLongClick(View v) { 

        return true; 
        } 
       }); 
+0

嗨!但是這與工具提示有什麼關係? – Arthur 2014-11-07 14:27:05

+0

我的週末是開始的,所以我回復星期一,如果有可能與工具提示和這個答案也是我們問題的解決方案。試試這個 – Lokesh 2014-11-07 15:25:08

1

容易和完美的方式,只需要使用android.support.v7.widget.TooltipCompat

TooltipCompat.setTooltipText(view, "...");