6

Tôi có một ứng dụng đang sử dụng SupportActionBar. Tôi đang sử dụng chế độ xem tùy chỉnh cho một hành động.Android ActionBar tùy chỉnh công cụ xem công cụ-tip

Vấn đề là các hành động mặc định sẽ hiển thị đầu công cụ khi tôi nhấn và giữ nhưng tác vụ tùy chỉnh của tôi không hiển thị.

Vì vậy, đây là hành động mặc định (như bạn có thể thấy, có một công cụ-tip): Action item with tool-tip

Và đây là hành động của tôi tùy chỉnh (không có công cụ-tip cho một này: /): enter image description here

Các xml cho các 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> 

ai đó có thể giúp đỡ?

+0

Bạn có trả lời hay không? @Arthur –

+0

Tôi sẽ đăng một bản cập nhật ngay sau khi tôi có thời gian để kiểm tra điều này;) Ưu tiên bạn biết: D – Arthur

+0

xem câu trả lời của tôi, nó dễ thực hiện và công việc của tôi kết thúc của tôi – Lokesh

Trả lời

9

Tôi không nghĩ rằng có bất kỳ cuộc gọi API "chính thức" cho việc này. Tôi tin rằng thêm một View.OnClickListener vào chế độ xem tùy chỉnh của bạn, như các câu trả lời khác được đề xuất, là tốt nhất có thể.

Những gì bạn có thể làm tốt hơn một chút, tuy nhiên, đang tính toán đúng vị trí cho bánh mì nướng đầu công cụ.Tôi muốn giới thiệu đơn giản là sao chép và dán đoạn mã có liên quan từ lớp ActionMenuItemView (từ mã nguồn thư viện hỗ trợ) vì nó giao dịch với một vài trường hợp đặc biệt:

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

Bạn có thể tìm thấy nó trong <android-sdk>\sources\android-21\android\support\v7\internal\view\menu.

+0

Nice, cảm ơn bạn! – Arthur

0

Như bạn đang sử dụng một cách bố trí tùy chỉnh cho các nút, các mã sau đây nên làm việc:

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

Chỉ cần thiết lập này như người nghe bấm dài của các nút trên thanh hành động.

0

Thử thêm giá trị withText vào tính năng showAsAction. Một cái gì đó như thế này

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

Sử dụng phương pháp findItem trên Menu để có được quan điểm của bạn, và thiết lập OnLongClickListener của bạn trên quan điểm của bạn.

Một thay đổi trong tập tin xml bạn của Menu đó là thêm dòng android:actionViewClass="android.widget.ImageButton" (bạn có thể thay đổi điều đó View):

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

bạn có thể nhận được lỗi vào đây để nhận được cha mẹ của bạn View Tôi nghĩ rằng nó nên bạn Main Xem bố cục tùy chỉnh. bạn có thể sử dụng nó đầu tiên sau đó sau khi sử dụng actionViewClass

Bây giờ nhận được trong onCreateOptionMenu() cho Long tổ chức sự kiện báo chí:

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

Display Toast với Gravity trên Top

Bạn có thể thấy: Playing with Toast

+0

Trông một chút hacky. Và tại sao tôi cần 'android: actionViewClass'? – Arthur

+0

Vì nó sẽ giúp bạn nhận được bất kỳ 'Chế độ xem' nào để kiểm soát sự kiện nhấp chuột' onLongPress' của bạn. –

+0

Vâng, thực ra bạn không cần 'androidLactionViewClass' để đến được nó. 'MenuItem item_chat = menu.findItem (R.id.action_chat);' đang làm việc mà không có điều đó. Và sau đó tôi chỉ có thể đặt một trình nghe 'onLongPress' vào chính khung nhìn hành động' Xem item_chat_action_view = MenuItemCompat.getActionView (item_chat); '. – Arthur

0

Tạo bố cục tùy chỉnh và đặt bố cục này trên thanh tác vụ, tôi hy vọng nó có thể hoạt động cho bạn

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

và bạn cũng thực hiện như thế này

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

Xin chào! Nhưng điều này phải làm gì với chú giải công cụ? – Arthur

+0

Cuối tuần của tôi bắt đầu vì vậy tôi trả lời thứ hai nếu có thể với chú giải công cụ và Câu trả lời này cũng là giải pháp cho chúng tôi đặt câu hỏi. Hãy thử điều này – Lokesh

1

dễ dàng và hoàn hảo bằng cách nào, chỉ cần sử dụng android.support.v7.widget.TooltipCompat:

TooltipCompat.setTooltipText(view, "..."); 
Các vấn đề liên quan