[英]How can I make a long click listener for an AppWidgetHostView
我正在制作一個啟動器,但我一直在為小部件制作一個長按監聽器。 我創建了一個擴展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();
}
}
我曾嘗試使用此鏈接中的代碼,但是當我在時鍾小部件上進行測試時,它onLongClickListener
兩次啟動onLongClickListener
。 此外,當小部件滾動時,無需長按,它也會啟動onLongClick
。 謝謝你的幫助。
--UPDATE-- 我正在使用調試器,發現在使用時鍾小部件時,截獲的唯一事件是第一個 ACTION_DOWN。 在那之后,它再也沒有拿起 ACTION_UP。
如果小部件的行為不像按鈕(所以當它不能被點擊時)你需要做一些更高級的事情來檢測長點擊。
您可以查看https://github.com/willli666/Android-Trebuchet-Launcher-Standalone/blob/master/src/com/cyanogenmod/trebuchet/LauncherAppWidgetHostView.java如果 Apache 許可證適用於您的項目,您可以復制粘貼整個文件,您只需要刪除getErrorView()
和充氣器就可以了。
這個想法是在檢測到初始 ACTION_DOWN 事件時開始超時,當超時觸發時,如果視圖仍然有焦點,那么你可以performLongClick()
。
這比人們預期的要困難得多,但至少這適用於所有小部件,即使是那些無法點擊的小部件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.