29

ビュー上でカーソルを移動しているときに ToolTip(QuickAction View) を表示したい。簡単な例を教えてください。ツールチップにはテキスト値のみが含まれます。

4

12 に答える 12

20

Android は、Android 4.0 以降の ActionBar ボタンに対してのみ「ツールヒント」をサポートします。しかし、Jaguar が既に述べたように、ホバリングの概念がないため、Android のツールチップはあまり意味がありません。

Android 4.0 以降、ボタンを長押しすると、通常のタイトル テキスト (xml ファイルまたはコードで設定) が表示されます。ただし、画面に十分なスペースがある場合は、アイコンの横の ActionBar に常に表示されます。

カスタムビューに使用したい場合は、ビューに を追加して自分で実装し、長押しすると aLongClickListenerを表示する必要があります。Toast

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

もちろん、ハードコードされた文字列ではなく、文字列にリソースを使用する必要があります。

于 2012-08-16T09:24:06.157 に答える
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.

于 2017-02-02T13:23:35.453 に答える
3

Androidにはツールのヒントがありません。タッチベースのUIです。現在のタッチセンサーは、通常、ツールのヒントが役立つような方法でホバリングを検出することはできません。

タッチスクリーンに「ホバリング」するという概念はありませんが、ビューにLongClickListenerを設定し、長押しするとトーストが表示されるようにすることができます。

于 2012-08-16T09:12:46.070 に答える
3

ビューのツール ヒントを表示する必要がある場合はCheatSheet、Roman Nurik の util クラスを使用できます。(Toastおよびオプションcontent descriptionでツールチップを表示するために使用します。)

それは

長押し時にアイコンのみの UI 要素のチート シート (ツールヒント) を表示するための Android ヘルパー クラス。これは、アイコンのみのアクション バー アイテムとタブの既定のプラットフォーム動作です。このクラスは、他のそのような UI 要素に対してこの動作を提供します。

于 2016-09-30T18:37:32.297 に答える