29

当我在视图上移动光标时,我想显示工具提示(快速操作视图)。谁能给我一个简单的例子吗?工具提示将仅包含文本值。

4

12 回答 12

33

可能使用myView.setTooltipText(CharSequence)(从 API 级别 26)或TooltipCompat(在 API 级别 26 之前)是一个附加选项:

TooltipCompat.setTooltipText(myView, context.getString(R.string.myString));

文档说:

用于模拟 API 级别 26 之前的 {@link View#setTooltipText(CharSequence)} 行为的帮助类。

于 2017-11-14T13:04:46.060 回答
21

推荐使用 AndroidX。

Android 4.0 (API 14) 及更高版本

AndroidX 支持库添加了对视图和菜单项的工具提示(带有描述性文本的小弹出窗口)的支持。

使用setTooltipText设置工具提示文本,该文本将显示在视图旁边的一个小弹出窗口中。

请参见以下示例:

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
TooltipCompat.setTooltipText(fab, "Send an email");

将显示工具提示:

  • 长按时,除非另有处理(通过 OnLongClickListener 或上下文菜单)。
  • 悬停时,在指针停止移动后短暂延迟

要将 Appcompat 库添加到您的项目中,

  1. 打开应用程序的 build.gradle 文件。

  2. 将支持库添加到依赖项部分。

    dependencies {
    
    compile "androidx.appcompat:appcompat:1.1.0"
    }
    

Android 8.0(API 级别 26)及更高版本

如果您支持的最低版本是 Android 8.0(API 级别 26)或更高版本,您可以通过调用 setTooltipText() 方法在 View 中指定工具提示文本。您还可以使用相应的 XML 设置 tooltipText 属性。

要在 XML 文件中指定工具提示文本,请设置 android:tooltipText 属性,如下例所示:

<android.support.design.widget.FloatingActionButton
    android:id="@+id/fab"
    android:tooltipText="Send an email" />

要在代码中指定工具提示文本,请使用 setTooltipText(CharSequence) 方法,如以下示例所示:

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setTooltipText("Send an email");
于 2017-08-22T07:15:50.950 回答
20

Android 仅从 Android 4.0 开始支持 ActionBar 按钮的“工具提示”。但正如 Jaguar 已经提到的,Android 中的工具提示没有多大意义,因为没有悬停的概念。

从 Android 4.0 开始,如果您长按按钮,则会出现正常的标题文本(您在 xml 文件中或通过代码设置)。但是如果屏幕上有足够的空间,它将在图标旁边的 ActionBar 中一直可见。

如果您想将其用于自定义视图,则需要通过将 a 添加到视图中来自己实现它,并在长按时LongClickListener显示 a :Toast

view.setOnLongClickListener(new OnLongClickListener() {
    public boolean onLongClick(View v) {
        Toast.makeText(v.getContext(), "My tool-tip text", Toast.LENGTH_SHORT).show();
        return true;
    }
}

当然,您应该为字符串使用资源,而不是硬编码字符串。

于 2012-08-16T09:24:06.157 回答
7

从 Android API 14+ 开始,有一个悬停事件。你可以做,

view.setOnHoverListener(...)

并听MotionEvent诸如ACTION_HOVER_ENTERand之类的 s ACTION_HOVER_EXIT,而不是onLongClick.

于 2013-10-29T08:20:19.843 回答
4

根据GregoryK 的回答,我创建了一个新的 ImageButton 类 - 请参见下面的代码。要使用它,您需要做的就是将ImageButton布局中的替换为com.yourpackage.ImageButtonWithToolTip并赋予它一个android:contentDescription属性(因为这是将在工具提示中显示的文本)。

package com.yourpackage;

import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.Rect;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.widget.ImageButton;
import android.widget.Toast;

public class ImageButtonWithToolTip extends ImageButton {

    private static final int ESTIMATED_TOAST_HEIGHT_DIPS = 48;

    public ImageButtonWithToolTip(Context context) {
        super(context);
        init();
    }

    public ImageButtonWithToolTip(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public ImageButtonWithToolTip(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    @TargetApi(21)
    public ImageButtonWithToolTip(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        init();
    }

    private void init() {
        setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {

                /**
                 * You should set the android:contentDescription attribute in this view's XML layout file.
                 */

                String contentDescription = getContentDescription().toString();

                if (TextUtils.isEmpty(contentDescription)) {

                    /**
                     * There's no content description, so do nothing.
                     */

                    return false; // Not consumed

                }
                else {

                    final int[] screenPos = new int[2]; // origin is device display
                    final Rect displayFrame = new Rect(); // includes decorations (e.g. status bar)
                    view.getLocationOnScreen(screenPos);
                    view.getWindowVisibleDisplayFrame(displayFrame);

                    final Context context = view.getContext();
                    final int viewWidth = view.getWidth();
                    final int viewHeight = view.getHeight();
                    final int viewCenterX = screenPos[0] + viewWidth / 2;
                    final int screenWidth = context.getResources().getDisplayMetrics().widthPixels;
                    final int estimatedToastHeight = (int) (ESTIMATED_TOAST_HEIGHT_DIPS
                            * context.getResources().getDisplayMetrics().density);

                    Toast toolTipToast = Toast.makeText(context, contentDescription, Toast.LENGTH_SHORT);
                    boolean showBelow = screenPos[1] < estimatedToastHeight;
                    if (showBelow) {
                        // Show below
                        // Offsets are after decorations (e.g. status bar) are factored in
                        toolTipToast.setGravity(Gravity.TOP | Gravity.CENTER_HORIZONTAL,
                                viewCenterX - screenWidth / 2,
                                screenPos[1] - displayFrame.top + viewHeight);
                    }
                    else {
                        // Show above
                        // Offsets are after decorations (e.g. status bar) are factored in
                        // NOTE: We can't use Gravity.BOTTOM because when the keyboard is up
                        // its height isn't factored in.
                        toolTipToast.setGravity(Gravity.TOP | Gravity.CENTER_HORIZONTAL,
                                viewCenterX - screenWidth / 2,
                                screenPos[1] - displayFrame.top - estimatedToastHeight);
                    }

                    toolTipToast.show();

                    return true; // Consumed

                }

            }

        });

    }

}

您可以使用相同的方法来扩展其他视图 - 例如,Button.

于 2017-02-02T13:23:35.453 回答
3

Android 没有工具提示。它是一个基于触摸的 UI。当前的触摸传感器通常无法以工具提示有用的方式检测悬停。

在触摸屏中没有“悬停”的概念,但您可以为您的视图设置一个LongClickListener,并在长按后出现一个 Toast。

于 2012-08-16T09:12:46.070 回答
3

如果您需要显示任何视图的工具提示,您可以使用CheatSheetRoman Nurik 的 util 类。(使用Toast和可选content description地显示工具提示。)

这是

用于在长按时显示仅图标 UI 元素的备忘单(工具提示)的 Android 助手类。这已经是仅图标操作栏项目和选项卡的默认平台行为。此类为任何其他此类 UI 元素提供此行为

于 2016-09-30T18:37:32.297 回答
1
package com.nbfc.tekis.tooltipexample;

import android.support.v7.app.AppCompatActivity; import
android.os.Bundle; import android.view.View; import
android.widget.Button; import android.widget.GridView;

import it.sephiroth.android.library.tooltip.Tooltip;

public class MainActivity extends AppCompatActivity {
    /*Button button1,button2,button3,button4;*/

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void bottomTooltip(View view) {
        Button button1=(Button)findViewById(R.id.button1);
        Tooltip.make(this,new Tooltip.Builder()
            .anchor(button1, Tooltip.Gravity.BOTTOM)
            .closePolicy(new Tooltip.ClosePolicy()
            .insidePolicy(true,false)
            .outsidePolicy(true,false),4000)
            .activateDelay(900)
            .showDelay(400)
            .text("Android tooltip bottom")
            .maxWidth(600)
            .withArrow(true)
            .withOverlay(true)
            .build())
            .show();
    }

    public void topTooltip(View view) {
        Button button3=(Button)findViewById(R.id.button3);
        Tooltip.make(this,new Tooltip.Builder()
            .anchor(button3, Tooltip.Gravity.TOP)
            .closePolicy(new Tooltip.ClosePolicy()
            .insidePolicy(true,false)
            .outsidePolicy(true,false),4000)
            .activateDelay(900)
            .showDelay(400)
            .text("Android tooltip top")
            .maxWidth(600)
            .withOverlay(true)
            .withArrow(true)
            .build())
            .show();
    }

    public void rightTooltip(View view) {
        Button button2=(Button)findViewById(R.id.button2);
        Tooltip.make(this,new Tooltip.Builder()
            .anchor(button2, Tooltip.Gravity.RIGHT)
            .closePolicy(new Tooltip.ClosePolicy()
            .insidePolicy(true,false)
            .outsidePolicy(true,false),4000)
            .activateDelay(900)
            .showDelay(400)
            .text("Android tooltip right")
            .maxWidth(600)
            .withArrow(true)
            .withOverlay(true)
            .build())
            .show();
    }

    public void leftTooltip(View view) {
        Button button4=(Button)findViewById(R.id.button4);
        Tooltip.make(this,new Tooltip.Builder()
            .anchor(button4, Tooltip.Gravity.LEFT)
            .closePolicy(new Tooltip.ClosePolicy()
            .insidePolicy(true,false)
            .outsidePolicy(true,false),4000)
            .text("Android tooltip left")
            .maxWidth(600)
            .withArrow(true)
            .withOverlay(true)
            .build())
            .show();
    } 
}
于 2017-05-02T15:00:21.617 回答
1

将此添加到您的按钮

android:tooltipText="Tooltip text goes here"
于 2019-06-04T15:17:13.197 回答
1

根据禁令的回答,我创建了这个方法。

它不对吐司大小做任何假设。只需根据视图相对于窗口的位置(即窗口中心的左/右/上方/下方)放置工具提示重力。吐司总是从视图的中心开始,并分别向右/左/下/上延伸。

查看示例

private static void setToastGravity(View view, Toast toast) {
    final Rect viewRect = new Rect(); // view rect
    final Rect windowRect = new Rect(); // window rect
    view.getGlobalVisibleRect(viewRect);
    view.getWindowVisibleDisplayFrame(windowRect);

    int offsetX;
    int offsetY;
    int gravityX;
    int gravityY;

    if (viewRect.centerY() > windowRect.centerY()) {
        // above
        offsetY = windowRect.bottom - viewRect.centerY();
        gravityY = Gravity.BOTTOM;
    } else {
        // tooltip below the view
        offsetY = viewRect.centerY() - windowRect.top;
        gravityY = Gravity.TOP;
    }

    if (viewRect.centerX() > windowRect.centerX()) {
        // tooltip right of the view
        offsetX = windowRect.right - viewRect.centerX();
        gravityX = Gravity.END;
    } else {
        // tooltip left of the view
        offsetX = viewRect.centerX() - windowRect.left;
        gravityX = Gravity.START;
    }

    toast.setGravity(gravityX | gravityY, offsetX, offsetY);
}
于 2019-08-29T19:54:33.740 回答
0

我很乐意帮助你

请先生试试这个-> android-simple-tooltip

我希望这对你有用

示例:发布将其添加到存储库末尾的根 build.gradle 中:

allprojects {
    repositories {
        ...
        maven { url "https://jitpack.io" }
    }
}

添加依赖

dependencies {
    implementation 'com.github.douglasjunior:android-simple-tooltip:0.2.3'
}

将此代码添加到您的 MainActivity 类中,并为您的视图创建一个对象,该对象将与工具提示绑定

View yourView = findViewById(R.id.your_view);

    new SimpleTooltip.Builder(this)
        .anchorView(yourView)
        .text("Texto do Tooltip")
        .gravity(Gravity.END)
        .animated(true)
        .transparentOverlay(false)
        .build()
        .show();

在此处输入图像描述

于 2019-09-17T04:48:36.567 回答
0

https://github.com/skydoves/Balloon

这个库提供了一个轻量级的弹出式工具提示,完全可定制的箭头和动画。100% Kotlin 和所有必要的文档。它也在积极管理中。

这是他们页面上的一些 gif;

e

其他,

e

于 2021-02-24T07:56:19.840 回答