【问题标题】:Android ActionBar custom action view tool-tipAndroid ActionBar 自定义动作视图工具提示
【发布时间】:2014-12-27 15:43:24
【问题描述】:

我有一个使用 SupportActionBar 的应用。我正在使用自定义视图进行操作。

问题是,当我长按时默认操作会显示工具提示,但我的自定义操作不会。

所以这是默认操作(如您所见,有一个工具提示):

这是我的自定义操作(没有工具提示:/):

这 2 个的 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>

有人可以帮忙吗?

【问题讨论】:

  • 你有答案吗? @亚瑟
  • 一有时间我就会发布更新;)你知道的优先事项:D
  • 看我的答案,它易于实施,它的工作我的目的

标签: android android-actionbar actionview android-actionbar-compat


【解决方案1】:

我认为对此没有任何“官方”API 调用。正如其他答案所暗示的那样,我相信将 anView.OnClickListener 添加到您的自定义视图中尽可能好。

不过,您可以做得更好的是正确计算工具提示吐司的位置。我建议简单地从 ActionMenuItemView 类(来自支持库源代码)复制和粘贴相关的 sn-p,因为它处理一些特殊情况:

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

你可以在&lt;android-sdk&gt;\sources\android-21\android\support\v7\internal\view\menu找到它。

【讨论】:

    【解决方案2】:

    简单而完美的方法,只需使用android.support.v7.widget.TooltipCompat

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

    【讨论】:

    • 仅在 API 8+ 中可用
    • 这应该是公认的答案。也适用于 androidx.appcompat.widget.TooltipCompat 和 api 26 及更高版本,我们可以简单地执行 view.setTooltip("....")
    【解决方案3】:

    当您为按钮使用自定义布局时,以下代码应该可以工作:

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

    只需将此设置为操作栏中按钮的长按侦听器即可。

    【讨论】:

      【解决方案4】:

      尝试将值 withText 添加到 showAsAction 功能。像这样的

      android:showAsAction="ifRoom|always|withText"
      

      【讨论】:

        【解决方案5】:

        Menu 上使用findItem 方法来获取您的视图,并在您的视图上设置您的OnLongClickListener

        Menu 的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 而出现错误,我认为这应该是您自定义布局的主视图。可以先用再用actionViewClass

        现在进入onCreateOptionMenu() 参加长按活动:

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

        Top 上显示ToastGravity

        你可以看到:Playing with Toast

        【讨论】:

        • 看起来有点老套。为什么我需要android:actionViewClass
        • 因为它可以帮助您像任何View 一样控制您的onLongPress 点击事件。
        • 嗯,实际上你不需要androidLactionViewClass 来获得它。 MenuItem item_chat = menu.findItem(R.id.action_chat); 在没有它的情况下工作。然后我可以在动作视图本身上放置一个onLongPress 监听器View item_chat_action_view = MenuItemCompat.getActionView(item_chat);
        • 我会再等一会儿,看看是否有人提出更正式的答案,因为该工具提示不仅仅是在固定坐标处放置吐司(物品的确切位置 + 振动当显示工具提示时)。也许有一个 API 调用。如果没有更好的答案,我会接受你的。
        • 没关系,没问题,但你可以用选择器的可绘制图像来做那种振动。
        【解决方案6】:

        创建一个自定义布局并在操作栏上设置此布局,我希望它对你有用

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

        【讨论】:

        • 嗨!但这与工具提示有什么关系?
        • 我的周末开始了,所以如果可以的话,我会在星期一回复工具提示,这个答案也是我们问题的解决方案。试试这个
        猜你喜欢
        • 1970-01-01
        • 2012-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多