Как отображать подсказку в android?

Я хочу отображать подсказку (QuickAction View), когда я перемещаю курсор на представление. Может ли кто-нибудь дать мне простой пример? Tooltip будет содержать только текстовое значение.

Solutions Collecting From Web of "Как отображать подсказку в android?"

Android поддерживает «подсказку» только для кнопок ActionBar с Android 4.0. Но, как уже упоминалось Jaguar, подсказки для инструментов в 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; } } 

Конечно, вы должны использовать ресурс для строки, а не строчную кодированную строку.

Начиная с Android API 14+, есть событие для зависания . Ты можешь сделать,

 view.setOnHoverListener(...) 

И прослушивайте MotionEvent s, такие как ACTION_HOVER_ENTER и ACTION_HOVER_EXIT , а не onLongClick .

Android не содержит подсказок. Это сенсорный интерфейс. Современные сенсорные датчики обычно не могут распознавать зависание таким образом, чтобы подсказки инструментов были полезны.

В сенсорном экране нет понятия «зависание», но вы можете установить LongClickListener для своего представления и после долгого нажатия появиться тост.

Если вам нужно показать подсказку для любого вида, вы можете использовать класс CheatSheet от Roman Nurik. (Использование Toast и опциональное content description для показа всплывающей подсказки.)

это

Android-хелпер-класс для показа чит-листов (всплывающих подсказок) для элементов пользовательского интерфейса только для значков при длительном нажатии. Это уже поведение платформы по умолчанию для элементов панели задач и вкладок только для значков. Этот класс обеспечивает такое поведение для любого другого такого элемента интерфейса

Основываясь на ответе 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 (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 .

В редакции 26.0.1 в библиотеке поддержки добавлена ​​поддержка всплывающих подсказок (небольшие всплывающие окна с описательным текстом) для просмотров и пунктов меню.

Используйте setTooltipText, чтобы установить текст всплывающей подсказки, который будет отображаться в небольшом всплывающем окне рядом с представлением.

Отобразится всплывающая подсказка:

  • При длинном щелчке, если только он не обрабатывается иначе (OnLongClickListener или контекстное меню).
  • При наведении курсора, после небольшой задержки, так как указатель прекратил движение

Чтобы добавить библиотеку поддержки в проект приложения:

  1. Откройте файл build.gradle для своего приложения.
  2. Убедитесь, что раздел репозитория содержит раздел maven с конечной точкой https://maven.google.com .

Например:

  allprojects { repositories { jcenter() maven { url "https://maven.google.com" } } } 
  1. Добавьте библиотеку поддержки в раздел зависимостей.

     dependencies { compile "com.android.support:appcompat-v7:26.0.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(); } }