Android ActionBar自定义操作视图工具提示

时间:2014-10-31 10:38:45

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

我有一个使用SupportActionBar的应用。我是一个行动的自定义视图。

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

所以这是默认操作(如您所见,有一个工具提示): Action item with tool-tip

这是我的自定义操作(此工具没有工具提示:/): enter image description here

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

有人可以帮忙吗?

6 个答案:

答案 0 :(得分: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找到它。

答案 1 :(得分:2)

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

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

答案 2 :(得分: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;
    }
}

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

答案 3 :(得分:0)

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

android:showAsAction="ifRoom|always|withText"

答案 4 :(得分:0)

使用findItem上的Menu方法获取您的观看次数,并在您的观看次数上设置OnLongClickListener

添加热线xml的{​​{1}}菜单文件中的一处更改(您可以更改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); }

上显示Toast Gravity

您可以看到:Playing with Toast

答案 5 :(得分: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;
                   }
              });