如何在android中显示ToolTip?

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

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

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

如果你想将它用于自定义视图,你需要通过在视图中添加LongClickListener来自己实现它,并在按下long时显示Toast

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

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

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

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

文件说:

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

支持库的修订版26.0.1增加了对视图和菜单项的工具提示 (带有描述性文本的小popup窗口)的支持。

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

将显示工具提示:

  • 长按,除非以其他方式处理(通过OnLongClickListener或上下文菜单)。
  • 在hover时,指针停止移动后短暂延迟

要将支持库添加到应用程序项目:

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

例如:

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

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

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

 view.setOnHoverListener(...) 

并侦听ACTION_HOVER_EXIT ,如ACTION_HOVER_ENTERACTION_HOVER_EXIT ,而不是onLongClick

Android没有工具提示。 这是一个基于触摸的UI。 当前的触摸传感器通常不能以工具尖端有用的方式检测hover。

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

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

它是

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

根据GregoryK的回答 ,我创建了一个新的ImageButton类 – 请参阅下面的代码。 要使用它,您需要做的就是用com.yourpackage.ImageButtonWithToolTip替换布局中的ImageButton并给它一个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 (eg 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 (eg 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 (eg 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

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