簡體   English   中英

如何為 AppWidgetHostView 制作長按偵聽器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM