6

Ich habe eine App, die eine SupportActionBar verwendet. Ich verwende eine benutzerdefinierte Ansicht für eine Aktion.Android ActionBar benutzerdefinierte Aktion anzeigen Tool-Tipp

Die Sache ist, dass Standardaktionen einen Tool-Tipp anzeigen, wenn ich lange drücke, aber meine benutzerdefinierte Aktion nicht.

So, hier ist die Standardaktion (wie Sie sehen können, gibt es ein Tool-Tip): Action item with tool-tip

Und hier ist meine benutzerdefinierte Aktion (kein Werkzeug-Tipp für diese: /): enter image description here

Die xML für diese 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> 

Kann jemand helfen?

+0

Du hast oder nicht beantworten? @Arthur –

+0

Ich werde ein Update veröffentlichen, sobald ich Zeit habe, dies zu überprüfen;) Prioritäten, die Sie kennen: D – Arthur

+0

siehe meine Antwort, es ist einfach zu implementieren und seine Arbeit mein Ende – Lokesh

Antwort

9

Ich glaube nicht, gibt es keine „offizielle“ API-Aufrufe für diese. Ich glaube, ein View.OnClickListener zu Ihrer benutzerdefinierten Ansicht hinzuzufügen, wie die anderen Antworten vorschlagen, ist ungefähr so ​​gut wie möglich.

Was Sie jedoch ein wenig besser machen können, ist die richtige Berechnung der Position für das Tool-Tipp Toast.Ich würde einfach Kopieren und Einfügen der entsprechenden Ausschnitt aus der ActionMenuItemView Klasse (von der Support-Bibliothek Quellcode) empfehlen, da es mit einigen besonderen Fällen befasst:

@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; 
} 

Sie es in <android-sdk>\sources\android-21\android\support\v7\internal\view\menu finden.

+0

Nizza, danke! – Arthur

0

Wie Sie eine benutzerdefinierte Layout für die Schaltfläche verwenden, sollten Sie den folgenden Code arbeiten:

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

Gerade setzen Sie diese als lange Klick Zuhörer der Schaltfläche in der Aktionsleiste.

0

Versuchen Sie, der showAsAction-Funktion den Wert withText hinzuzufügen. So etwas wie dieses

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

Verwenden Sie die findItem Methode auf Menu Ihre Ansichten zu erhalten, und stellen Sie Ihre OnLongClickListener auf Ihrer Ansicht.

Eine Änderung Ihrer xml Datei-Menü die Zeile hinzufügen android:actionViewClass="android.widget.ImageButton" (können Sie, dass View ändern):

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

Sie Fehler hier Kann immer denken, dass Ihre Eltern View ich es sollten Sie Hauptansicht sein des benutzerdefinierten Layouts.

@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); 
    } 

Anzeige Toast mit Gravity auf Top

Sie sehen: Playing with Toast

+0

Sieht ein bisschen hacky. Und warum brauche ich 'android: actionViewClass'? – Arthur

+0

Weil es Ihnen helfen wird, wie jede 'Ansicht' Ihr' onLongPress' Klick Ereignis zu kontrollieren. –

+0

Nun, eigentlich brauchst du keine 'androidLactionViewClass' um dorthin zu gelangen. 'MenuItem item_chat = menu.findItem (R.id.action_chat);' funktioniert ohne das. Und dann kann ich einfach einen 'onLongPress'-Listener auf die Action-View selbst setzen 'View item_chat_action_view = MenuItemCompat.getActionView (item_chat);'. – Arthur

0

erstellen Sie können es erst nach actionViewClass

erhalten Jetzt in onCreateOptionMenu() für Long Press Event-Einsatz dann verwenden benutzerdefinierte Layout und legen Sie dieses Layout auf Aktionsleiste, ich hoffe, es kann für Sie arbeiten

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); 

und Sie implementieren auch wie diese

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

Hallo! Aber was hat das mit dem Tooltip zu tun? – Arthur

+0

Mein Wochenende ist gestartet, also antworte ich Montag, wenn es mit Tooltip möglich ist und diese Antwort auch eine Lösung für uns in Frage stellt. Versuchen Sie diese – Lokesh

1

Einfache und perfekte Art und Weise, verwenden Sie einfach android.support.v7.widget.TooltipCompat:

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