6

Bir SupportActionBar kullanan bir uygulamam var. Ben bir eylem için özel bir görünümdeyim.Android ActionBar özel eylem görünümü araç ipucu

Sorun şu ki, uzun sürdüğümde varsayılan eylemler bir araç ipucu görüntülüyor, ancak özel işlemim çalışmıyor. Action item with tool-tip

Ve burada benim özel eylemi (Bunun için hiçbir araç-ucu: /): is: enter image description here Yani burada

(Gördüğünüz gibi, orada bir takım ucu) varsayılan eylemdir bu 2 için

xml:

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

birisi yardım edebilir mi?

+0

Sen cevap var mı yok? @Arthur –

+0

Ben bunu kontrol etmek için zaman almak en kısa sürede bir güncelleme göndereceğiz;) Bildiğiniz öncelikler: D – Arthur

+0

cevabımı görmek, onun uygulama için kolay ve onun benim işim sonu – Lokesh

cevap

9

gibi uygulamak. Özel görüşünüze View.OnClickListener eklemenin, diğer yanıtların önerdiği gibi olabildiğince iyi eklendiğine inanıyorum.

Yine de biraz daha iyi ne yapabilirsiniz, alet ucu tostunun konumunu doğru hesaplıyor.Bunun birkaç özel durumlarda uğraşan olduğundan, sadece kopyalayarak ve ActionMenuItemView sınıfından (destek kitaplığı kaynak kodundan) İlgili yapıştırarak öneriyoruz:

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

Sen <android-sdk>\sources\android-21\android\support\v7\internal\view\menu 'da bulabilirsiniz.

+0

Güzel, teşekkürler! – Arthur

0

Düğme için özel bir düzen kullandığınız gibi, aşağıdaki kod çalışması gerekir:

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

Sadece işlem çubuğunda düğmenin uzun tıklama dinleyici olarak belirledi.

0

withText değerini showAsAction özelliğine eklemeye çalışın. Bu

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

gibi bir şey görüşlerinizi almak için Menu üzerine findItem yöntemi kullanın ve görünümde üzerinde OnLongClickListener ayarlayın. çizgi android:actionViewClass="android.widget.ImageButton" ekleyin Menü sizin xml dosyada

değişikliklerden biri (eğer View değiştirirsin):

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

Eğer Ebeveyn View almak için buraya hatayı getireyim Onu seni Ana Görünüm olması gerektiğini düşünüyorum özel düzen. Eğer actionViewClass

Şimdi Uzun Basın Etkinliği için onCreateOptionMenu() olsun kullanımdan sonra ilk önce kullanabilirsiniz:

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

Ekran ToastGravity ile Top

üzerinde görebilirsiniz: Playing with Toast

+0

Biraz hacky görünüyor. Ve neden android ihtiyacım var: actionViewClass'? – Arthur

+0

Çünkü, "onLongPress" tıklama etkinliğinizi kontrol etmek için herhangi bir 'Görünüm 'almanıza yardımcı olacaktır. –

+0

Eh, aslında almak için 'androidLactionViewClass' gerekmez. 'MenuItem item_chat = menu.findItem (R.id.action_chat);' Bu olmadan çalışıyor. Ve sonra sadece 'ViewLongPress' dinleyicisini aksiyon görünümünün üzerine koyabilirim' View item_chat_action_view = MenuItemCompat.getActionView (item_chat); '. – Arthur

0

Oluştur özel düzen ve bu düzeni eylem çubuğuna ayarla, umarım sizin için işe yarayabilir

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

ve ayrıca bunun için herhangi bir "resmi" API çağrıları vardır sanmıyorum bu

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

Merhaba! Ama bunun araç ipucu ile ne ilgisi var? – Arthur

+0

Haftasonum başladı, bu yüzden eğer araç ipucunda mümkünse pazara cevap veriyorum ve bu cevap da soru için bir çözüm. Bunu deneyin – Lokesh

1

Kolay ve mükemmel bir şekilde, sadece android.support.v7.widget.TooltipCompat kullanın:

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