如何在android中显示ToolTip?

时间:2012-08-16 09:08:51

标签: android

我想在视图上移动光标时显示工具提示(QuickAction视图)。任何人都可以给我一个简单的例子吗?工具提示只包含文本值。

12 个答案:

答案 0 :(得分:19)

Android仅支持Android 4.0上的ActionBar按钮的“工具提示”。但正如美洲虎已经提到的那样,Android中的工具提示并没有多大意义,因为没有悬停的概念。

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

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

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

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

答案 1 :(得分:18)

可能使用myView.setTooltipText(CharSequence)(来自API级别26)或TooltipCompat(API级别26之前)是一个额外的选项:

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

文档说:

  

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

答案 2 :(得分:8)

支持库的修订版26.0.1为视图和菜单项添加了对tooltips(带有描述性文字的小弹出窗口)的支持。

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

将显示工具提示:

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

Support Library添加到您的应用程序项目中:

  1. 打开应用程序的build.gradle文件。
  2. 确保存储库部分包含带有" https://maven.google.com"的maven部分。端点。
  3. 例如:

        allprojects {
    
        repositories {
            jcenter()
            maven {
                url "https://maven.google.com"
            }
          }
        }
    
    1. 将支持库添加到依赖项部分。

      dependencies {
      
      compile "com.android.support:appcompat-v7:26.0.1"
      }
      

答案 3 :(得分:7)

从Android API 14+开始,有一个event for hovering。你可以,

view.setOnHoverListener(...)

并倾听MotionEventACTION_HOVER_EXITonLongClick,而不是{{1}}。

答案 4 :(得分:4)

基于GregoryK's answer,我创建了一个新的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

答案 5 :(得分:3)

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

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

答案 6 :(得分:3)

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

  

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

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

答案 8 :(得分:0)

将此添加到您的按钮

android:tooltipText="Tooltip text goes here"

答案 9 :(得分:0)

根据禁令的答案,我创建了此方法。

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

See Example

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

答案 10 :(得分:0)

我很乐意为您提供帮助

先生,请尝试-> android-simple-tooltip

我希望对您有用

示例: 发布 将其添加到存储库末尾的root 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();

enter image description here

答案 11 :(得分:0)

https://github.com/skydoves/Balloon

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

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

e

另一个,

e