3

In the code below the problem i m facing is that in onTouchListener method both if and else part is getting executed each time. Anyone have idea why is it happening like that? and aim of my project is on touch event on anywhere in on the webview the dock layout must appear on another touch it must disappear.Can anyone help regarding this?

Thanks in advance ..

     public class MathiasdockActivity extends Activity {
    /** Called when the activity is first created. */
    RelativeLayout upperdock,parent;
    LinearLayout tocbottom,tocparent;
    boolean flag=true;
    WebView wv;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        parent=(RelativeLayout) findViewById(R.id.rl1);
        upperdock=(RelativeLayout) findViewById(R.id.upperdock);
        tocparent=(LinearLayout) findViewById(R.id.tocparent);
        tocbottom=(LinearLayout) findViewById(R.id.linearLayout3);
        upperdock.setVisibility(RelativeLayout.INVISIBLE);
        tocparent.setVisibility(LinearLayout.INVISIBLE);
        tocbottom.setVisibility(LinearLayout.INVISIBLE);
        wv = (WebView) findViewById(R.id.webView1);  
        wv.loadUrl("file:///android_asset/hotspot/07-03.html");
        wv.getSettings().setJavaScriptEnabled(true);


        wv.setOnTouchListener(new OnTouchListener() {

            public boolean onTouch(View v, MotionEvent event) {

                    if(flag)
                    {
                            Toast toast1 = Toast.makeText(getBaseContext(), Boolean.toString(flag) + "if", 1000);
                            toast1.show();
                            upperdock.bringToFront();
                            tocparent.bringToFront();
                            tocbottom.bringToFront();
                            upperdock.setVisibility(RelativeLayout.VISIBLE);
                            tocparent.setVisibility(LinearLayout.VISIBLE);
                            tocbottom.setVisibility(LinearLayout.VISIBLE);
                            flag=false;
                    }
                    else
                    {
                            Toast toast2 = Toast.makeText(getBaseContext(), Boolean.toString(flag) + "else", 1000);
                            toast2.show();
                            wv.bringToFront();
                            upperdock.setVisibility(RelativeLayout.INVISIBLE);
                            tocparent.setVisibility(LinearLayout.INVISIBLE);
                            tocbottom.setVisibility(LinearLayout.INVISIBLE);
                            flag=true;  

                    }

                    return flag;
            }
        });
    }
   }
4

3 に答える 3

1

その理由OnTouchListenerは、継続的に呼び出すため、ユーザーが最初にタッチしたことを確認する必要があるためです。MotionEvent.ACTION_DOWN

wv.setOnTouchListener(new OnTouchListener() {

        public boolean onTouch(View v, MotionEvent event) {

        if(event.getAction()== MotionEvent.ACTION_DOWN)
        {
                if(flag)
                {
                   Toast toast1 = Toast.makeText(getBaseContext(), Boolean.toString(flag) + "if", 1000);
                   toast1.show();
                   upperdock.bringToFront();
                   tocparent.bringToFront();
                   tocbottom.bringToFront();
                   upperdock.setVisibility(RelativeLayout.VISIBLE);
                   tocparent.setVisibility(LinearLayout.VISIBLE);
                   tocbottom.setVisibility(LinearLayout.VISIBLE);
                   flag=false;
                }
                else
                {
                   Toast toast2 = Toast.makeText(getBaseContext(), Boolean.toString(flag) + "else", 1000);
                   toast2.show();
                   wv.bringToFront();
                   upperdock.setVisibility(RelativeLayout.INVISIBLE);
                   tocparent.setVisibility(LinearLayout.INVISIBLE);
                   tocbottom.setVisibility(LinearLayout.INVISIBLE);
                   flag=true;
                }
          }
              return flag;
        }
    });
于 2012-05-30T06:43:18.017 に答える
1

両方が同時に実行されているように見えます。実際には別々に実行されますが、タッチ イベントが非常に高速に発生しているため、両方が同時に実行されているように見えます。あなたがすべきことは、最初にモーションイベントのタイプを検出するMotionEvent.ACTION_MOVEことです。それ以外の場合、すべてのモーション イベントはリスナー コードによって処理されます。

もちろん、コードで と の両方が呼び出される理由ifelse、ステートメントの実行が交互になるように、各ステートメントでフラグを true と false に設定しているためです。

于 2012-05-30T06:43:28.880 に答える
1

タッチイベントはアクションが多いのでif条件と合わせてご利用ください。

1.MotionEvent.ACTION_DOWN
2.MotionEvent.ACTION_MOVE
3.MotionEvent.ACTION_UP
.
.
.
etc

そして、いつもreturn false;

アップデート

if(event.getAction()== MotionEvent.ACTION_DOWN)
{
  //when you touch on screen
}
else if(event.getAction()== MotionEvent.ACTION_MOVE)
{
    //when you move your finger on screen
}
else if(event.getAction()== MotionEvent.ACTION_UP)
{
  //when you release your finger from screen
}
于 2012-05-30T06:45:21.760 に答える