0

さて、ここで問題です。ウィジェットを作成しましたが、タップとダブルタップを検出する必要があります。トリガーされると、別のビューが表示されます。テスト目的で、ロギングを使用して、それが機能しているかどうかを確認しました。以下は私のコードです:

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
import android.view.GestureDetector.OnDoubleTapListener;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;
import android.widget.Toast;

/**
 * @Author Jan Zivkovic
 * 
 * NE DELA, OVERRIDA AMPAK NE DELA!
 */

public class UpdateWidget extends Activity implements OnGestureListener{

    private GestureDetector gesture;

    public void onCreate(Bundle savedInstanceState)  
    {  
        super.onCreate(savedInstanceState);  
        //setContentView(R.layout.main);  
        Log.w("TEST", "started");


        gesture = new GestureDetector(this);  

        //set the on Double tap listener  
        gesture.setOnDoubleTapListener(new OnDoubleTapListener()  
        {  
            @Override  
            public boolean onDoubleTap(MotionEvent e)  
            {  
                //set text color to green  
                //tvTap.setTextColor(0xff00ff00);  
                //print a confirmation message  
                //tvTap.setText("The screen has been double tapped.");  
                Log.w("TEST", "Double tap");
                return false;  
            }  

            @Override  
            public boolean onDoubleTapEvent(MotionEvent e)  
            {  
                //if the second tap hadn't been released and it's being moved  
                if(e.getAction() == MotionEvent.ACTION_MOVE)  
                {  
                    //set text to blue  
                    //tvTapEvent.setTextColor(0xff0000ff);  
                    //print a confirmation message and the position  
                    //tvTapEvent.setText("Double tap with movement. Position:\n"  
                    //        + "X:" + Float.toString(e.getRawX()) +  
                    //        "\nY: " + Float.toString(e.getRawY()));  
                }  
                else if(e.getAction() == MotionEvent.ACTION_UP)//user released the screen  
                {  
                    //setContentView();  
                }  
                return false;  
            }  

            @Override  
            public boolean onSingleTapConfirmed(MotionEvent e)  
            {  
                //set text color to red  
                //tvTap.setTextColor(0xffff0000);  
                //print a confirmation message and the tap position  
                //tvTap.setText("Double tap failed. Please try again.");  
                Log.w("TEST", "Single tap");
                return false;  
            }  
        });  
    }

    @Override
    public boolean onDown(MotionEvent arg0) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean onFling(MotionEvent arg0, MotionEvent arg1, float arg2,
            float arg3) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public void onLongPress(MotionEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2,
            float arg3) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public void onShowPress(MotionEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean onSingleTapUp(MotionEvent arg0) {
        // TODO Auto-generated method stub
        return false;
    }

}

Widget Provider クラス、onUpdate メソッド (5 分ごとにトリガー)

@Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        for (int i = 0; i < appWidgetIds.length; i++) {
            int appWidgetId = appWidgetIds[i];
            Intent updateIntent = new Intent(context, UpdateWidget.class);
            // Identifies the particular widget...
            updateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
            updateIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            // Make the pending intent unique...
            updateIntent.setData(Uri.parse(updateIntent.toUri(Intent.URI_INTENT_SCHEME)));
            PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, updateIntent, 0);


            //context.startActivity(updateIntent);

            RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout);//R.layout.widget_layout
            views.setTextViewText(R.id.subject1, "subject1 test");
            views.setOnClickPendingIntent(R.id.widget_layout, pendingIntent);
            appWidgetManager.updateAppWidget(appWidgetId, views);
            Log.w("Schedule", "Widget Updated = " + appWidgetId);
        }
        super.onUpdate(context, appWidgetManager, appWidgetIds);
    }

しかし、これまでに得たものは次のとおりです。通常、ウィジェットをタップまたはダブルタップすると、電話が振動します。これを使用すると、電話をタップしても振動しなくなり、logcat に何も出力されなくなります。この問題は、ここ数日間私を悩ませています。うまくいけば、他の誰かが私が間違っていることを知っているでしょう。

編集:最も重要なことを忘れていました。私はAndroid 2.2 APIレベル8(Froyo)を使用しており、Android 2.3.6を搭載したSamsung Galaxy Ace VEでテストしています

4

1 に答える 1

1

ウィジェットを作りました

あなたのコードを考えると、他の Android 開発者が「アプリ ウィジェット」と呼んでいるものを意味していると思います。

タップを検出してダブルタップする必要があります

ダブルタップは検出が困難になります。

以下は私のコードです

コードの最初のブロックは、アプリ ウィジェットではないアクティビティ用です。

コードの 2 番目のブロックは、ユーザーがアプリ ウィジェットをタップしたときにアクティビティを呼び出します。それは問題ありませんが、ダブルタップの検出には役立ちません。実際、最初のタップの後にアクティビティが画面を引き継ぐため、通常、ユーザーが最初にダブルタップするのを防ぎます。

アプリ ウィジェットでダブルタップを使用しないようにしてください。アプリ ウィジェットに 2 つの異なるアイテムを用意して、さまざまなイベントを区別します (シングル タップでやりたいことと、ダブル タップでやりたいこと)。

于 2013-04-09T16:22:52.767 に答える