【问题标题】:How can I make a long click listener for an AppWidgetHostView如何为 AppWidgetHostView 制作长点击监听器
【发布时间】:2017-08-09 23:58:44
【问题描述】:

我正在制作一个启动器,但我一直坚持为小部件制作一个长按监听器。我创建了一个扩展AppWidgetHost 的类和另一个扩展AppWidgetHostView 的类。他们拦截触摸事件,如果它的动作向上,它会查看并查看动作向下是否持续了 400L。除非小部件上没有按钮,否则它可以正常工作。例如,时钟小部件不能长按。

这是longClickListener在主机视图上的实现:

hostView.setOnLongClickListener(new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View view) {
        new AlertDialog.Builder(WidgetEdge.this)
            .setTitle("Options")
            .setMessage("Do you want to delete or resize widget?")
            .setIcon(android.R.drawable.sym_def_app_icon)
            .setNegativeButton("Delete", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int whichButton) {
                    removeWidget(hostView);
                    Toast.makeText(WidgetEdge.this, "Widget Deleted", Toast.LENGTH_SHORT).show();
                }
            })
            .setPositiveButton("Resize", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    resizeView(hostView);
                }
            }).show();
        return false;
    }
});

这是AppWidgetHostView 类:

public class LauncherAppWidgetHostView extends AppWidgetHostView{
    private LayoutInflater mInflater;
    WidgetEdge context;
    private OnLongClickListener longClick;
    private long down;

    public LauncherAppWidgetHostView(Context context) {
        super(context);
        this.context = (WidgetEdge) context;
        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public void setOnLongClickListener(OnLongClickListener l) {
        this.longClick = l;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        boolean trueOrFalse = false;
        switch(ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                down = System.currentTimeMillis();
                this.getParent().requestDisallowInterceptTouchEvent(true);
                trueOrFalse = false;
                break;
            case MotionEvent.ACTION_UP:
                boolean upVal = System.currentTimeMillis() - down > 400L;
                if( upVal ) {
                    longClick.onLongClick(LauncherAppWidgetHostView.this);
                    trueOrFalse = true;
                }
                break;
        }
        return trueOrFalse;
    }

    @Override
    protected View getErrorView() {
        return mInflater.inflate(R.layout.appwidget_error, this, false);
    }
} 

这里是AppWidgetHost

import android.appwidget.AppWidgetHost;
import android.appwidget.AppWidgetHostView;
import android.appwidget.AppWidgetProviderInfo;
import android.content.Context;

class LauncherAppWidgetHost extends AppWidgetHost {
    LauncherAppWidgetHost(Context context, int hostId) {
        super(context, hostId);
    }

    @Override
    protected AppWidgetHostView onCreateView(Context context, int appWidgetId,
                                             AppWidgetProviderInfo appWidget) {
        return new LauncherAppWidgetHostView(context);
    }

    @Override
    public void stopListening() {
        super.stopListening();
        clearViews();
    }
}

我曾尝试使用来自this link 的代码,但是当我在时钟小部件上进行测试时,它会两次启动onLongClickListener。此外,当小部件滚动时,无需长按,它也会启动onLongClick。感谢您的帮助。

--更新-- 我正在使用调试器,发现在使用时钟小部件时,唯一拦截的事件是第一个 ACTION_DOWN。之后它再也没有拿起 ACTION_UP。

【问题讨论】:

    标签: java android widget onlongclicklistener


    【解决方案1】:

    如果小部件的行为不像按钮(因此当它无法被点击时),您需要执行更高级的操作来检测长按。

    你可以看看https://github.com/willli666/Android-Trebuchet-Launcher-Standalone/blob/master/src/com/cyanogenmod/trebuchet/LauncherAppWidgetHostView.java 如果 Apache 许可证适用于您的项目,您可以复制粘贴整个文件,您只需要删除 getErrorView() 和充气器就可以了。

    思路是在检测到初始ACTION_DOWN事件的时候开始超时,当超时触发时,如果view还有焦点,那么可以performLongClick()

    这比人们预期的要难完成,但至少这适用于所有小部件,即使是那些无法点击的小部件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-03
      • 1970-01-01
      • 2018-06-22
      • 2012-02-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多