【发布时间】: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