当我在视图上移动光标时,我想显示工具提示(快速操作视图)。谁能给我一个简单的例子吗?工具提示将仅包含文本值。
12 回答
可能使用myView.setTooltipText(CharSequence)
(从 API 级别 26)或TooltipCompat
(在 API 级别 26 之前)是一个附加选项:
TooltipCompat.setTooltipText(myView, context.getString(R.string.myString));
文档说:
用于模拟 API 级别 26 之前的 {@link View#setTooltipText(CharSequence)} 行为的帮助类。
推荐使用 AndroidX。
Android 4.0 (API 14) 及更高版本
AndroidX 支持库添加了对视图和菜单项的工具提示(带有描述性文本的小弹出窗口)的支持。
使用setTooltipText设置工具提示文本,该文本将显示在视图旁边的一个小弹出窗口中。
请参见以下示例:
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
TooltipCompat.setTooltipText(fab, "Send an email");
将显示工具提示:
- 长按时,除非另有处理(通过 OnLongClickListener 或上下文菜单)。
- 悬停时,在指针停止移动后短暂延迟
要将 Appcompat 库添加到您的项目中,
打开应用程序的 build.gradle 文件。
将支持库添加到依赖项部分。
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");
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;
}
}
当然,您应该为字符串使用资源,而不是硬编码字符串。
从 Android API 14+ 开始,有一个悬停事件。你可以做,
view.setOnHoverListener(...)
并听MotionEvent
诸如ACTION_HOVER_ENTER
and之类的 s ACTION_HOVER_EXIT
,而不是onLongClick
.
根据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
.
Android 没有工具提示。它是一个基于触摸的 UI。当前的触摸传感器通常无法以工具提示有用的方式检测悬停。
在触摸屏中没有“悬停”的概念,但您可以为您的视图设置一个LongClickListener,并在长按后出现一个 Toast。
如果您需要显示任何视图的工具提示,您可以使用CheatSheet
Roman Nurik 的 util 类。(使用Toast
和可选content description
地显示工具提示。)
这是
用于在长按时显示仅图标 UI 元素的备忘单(工具提示)的 Android 助手类。这已经是仅图标操作栏项目和选项卡的默认平台行为。此类为任何其他此类 UI 元素提供此行为
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();
}
}
将此添加到您的按钮
android:tooltipText="Tooltip text goes here"
根据禁令的回答,我创建了这个方法。
它不对吐司大小做任何假设。只需根据视图相对于窗口的位置(即窗口中心的左/右/上方/下方)放置工具提示重力。吐司总是从视图的中心开始,并分别向右/左/下/上延伸。
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);
}
我很乐意帮助你
请先生试试这个-> 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();
https://github.com/skydoves/Balloon
这个库提供了一个轻量级的弹出式工具提示,完全可定制的箭头和动画。100% Kotlin 和所有必要的文档。它也在积极管理中。
这是他们页面上的一些 gif;
其他,