Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

Возможно использование myView.setTooltipText(CharSequence) (от уровня API 26) или TooltipCompat (до уровня API-уровня 26) является дополнительным вариантом:

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

Документация гласит:

Класс помощника, используемый для эмуляции поведения {@link View # setTooltipText (CharSequence)} до уровня API 26.

Ответ 3

Android 4.0 (API 14) и higher

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

Используйте 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-rc01"
    }
    

Android 8.0 (API level 26) и higher

Если ваша минимальная поддерживаемая версия - Android 8.0 (уровень API 26) и выше, вы можете указать текст всплывающей подсказки в представлении, вызвав метод setTooltipText(). Вы также можете установить свойство tooltipText, используя соответствующий XML.

Чтобы указать текст всплывающей подсказки в файлах 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");

Ответ 4

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

view.setOnHoverListener(...)

и прослушать MotionEvent, например ACTION_HOVER_ENTER и ACTION_HOVER_EXIT вместо onLongClick.

Ответ 5

На основе ответа 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 XML layout file.
                 */

                String contentDescription = getContentDescription().toString();

                if (TextUtils.isEmpty(contentDescription)) {

                    /**
                     * There 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.

Ответ 6

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

Там нет понятия "зависания" на сенсорном экране, но вы можете установить LongClickListener для своего представления и иметь Toast появляются после долгого нажатия.

Ответ 7

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

Это

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

Ответ 8

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

Ответ 9

добавь это к своей кнопке

android:tooltipText="Tooltip text goes here"

Ответ 10

Основываясь на запрете ответа, я создал этот метод.

Это не предполагает ничего о размере тоста. Просто размещает силу тяжести кончика инструмента в зависимости от того, где вид относительно окна (то есть слева/справа/выше/ниже центра окна). Тост всегда начинается с центра вида и будет вытягиваться вправо/влево/внизу/вверх соответственно.

Смотрите пример

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

Ответ 11

Я буду рад помочь вам

Пожалуйста, сэр Попробуйте это -> андроид-простой подсказка

Я надеюсь, что это сработает для вас

Пример : Выпуск Добавьте его в свой корневой 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