-1

私のアプリにはポップアップメニューがあり、menuitemをクリックするとGPSの場所が収集されます.問題は、メニューをダブルタップすると2回トリガーされますが、onclickのみを実行しているため、どこが間違っているのかわかりません

LinearLayout popupmain = (LinearLayout) view
                .findViewById(R.id.popupmain);
        ImageView popupImage = (ImageView) view.findViewById(R.id.popupimg);
        TextView popupName = (TextView) view.findViewById(R.id.popupname);

        popupImage.setImageResource(popUpMenu.getImageResource());
        popupName.setText(popUpMenu.getMenuName());
        popupName.setTag(popUpMenu);
        popupmain.setTag(popUpMenu);
        popupName.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                doAction(v, activity);

            }
        });

        popupmain.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                doAction(v, activity);

            }
        }); 


        return view;
    }

    public void doAction(View v, Activity activity) {

            Context myContext = v.getContext();
            PopUpMenu popUpMenu = (PopUpMenu) v.getTag();
            String result = popUpMenu.getMenuName();
            if (result != null
                    && result.equalsIgnoreCase(myContext.getResources().getString(
                            R.string.savecurrentlocation))) {
                getLocation();  
        }
        private void getLocation() {
                manager = (LocationManager) parentActivity
                        .getSystemService(Context.LOCATION_SERVICE);
                listener = new ManageLocation();
                listener.setSucessCallBack(this, "setLocation");
                listener.setFailureCallBack(this, "setNoLocation");
                manager.requestLocationUpdates(
                        new Utils().getCurrentPlaceLocationProvider(manager), 0, 0,
                        listener);

            }

どんな助けでも大歓迎です。

私の popupmain xml ファイル

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/popupmain"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="5dp">

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:paddingLeft="5dp" >

        <ImageView
            android:id="@+id/popupimage"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <TextView
            android:id="@+id/popupname"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:padding="8dp"
            android:text="@string/default_date"
            android:textColor="#000000"
            android:textSize="15dp"
            android:typeface="serif" />
    </LinearLayout>

</LinearLayout>
4

4 に答える 4

1

popName と popImage がアクティビティまたはフラグメント XML の popMain にあるとは思えません。

それらがこのレイアウト上にある場合、それは非常に正常な動作です。

レイアウトルートは、処理後に子をイベントするためです。

このコードを削除します

   popupmain.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                doAction(v, activity);

            }
        }); 

または、このような制御ロジックを追加します(あなたの主なアイデアはわかりません)

   popupName.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
            if(popupMainOpened)
                doAction(v, activity);

            }
        });

        popupmain.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {


            if(!popupMainOpened)
                doAction(v, activity);

            }
        }); 

または、LinearLayout を拡張して LinearLayout を実装し、onTouchEvent http://developer.android.com/reference/android/view/View.html#onTouchEvent(android.view.MotionEvent )をオーバーライドします。

于 2013-01-23T07:45:49.537 に答える
0

これはテストされていないコードであることに注意してください。メモ帳に打ち込んだだけです。そのままの形で機能するかどうかはわかりませんが、その背後にあるロジックを理解するのに役立つはずです. そしてもちろん、フォーマットは少しずれています。必要に応じて適応します。

public class YourAdapter extends BaseAdapter {

boolean runningAction = false;  // DECLARE AS A GLOBAL INSTANCE

    // IN YOUR GETVIEW()

    LinearLayout popupmain = (LinearLayout) view.findViewById(R.id.popupmain);
    ImageView popupImage = (ImageView) view.findViewById(R.id.popupimg);
    TextView popupName = (TextView) view.findViewById(R.id.popupname);

    popupImage.setImageResource(popUpMenu.getImageResource());
    popupName.setText(popUpMenu.getMenuName());

    // I AM SKIPPING THE REST

    popupmain.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            if (runningAction == false) {
            doAction(v, activity);
        } else {
                // DO NOTHING OR SHOW A TOAST THAT A FUNCTION IS IN PROGRESS
        }
        }
    });

    return view;
}

    // THE doAction()
    public void doAction(View v, Activity activity) {

        // TOGGLE THE boolean flag runningAction
        runningAction = true;

        Context myContext = v.getContext();
        PopUpMenu popUpMenu = (PopUpMenu) v.getTag();
        String result = popUpMenu.getMenuName();
        if (result != null
                    && result.equalsIgnoreCase(myContext.getResources().getString(
                            R.string.savecurrentlocation))) {
            getLocation();  
        }

    // THE getLocation()
    private void getLocation() {
        manager = (LocationManager) parentActivity
                        .getSystemService(Context.LOCATION_SERVICE);
        listener = new ManageLocation();
        listener.setSucessCallBack(this, "setLocation");
        listener.setFailureCallBack(this, "setNoLocation");
        manager.requestLocationUpdates(
                        new Utils().getCurrentPlaceLocationProvider(manager), 0, 0,
                        listener);

        // TOGGLE THE boolean flag runningAction TO PREPARE FOR NEXT LOCATION UPDATE
        runningAction = false;

     }
}

また、 ClickListener のみを に設定し、 には設定していないことに注意してくださいpopupmain LinearLayoutpopupName TextView

于 2013-01-23T10:29:16.077 に答える
0

「popUpMenu」インスタンスをプライベート クラス メンバーとして保持し、「doAction()」を呼び出す前に既に表示されているかどうかを確認します。

于 2013-01-23T07:39:32.253 に答える
0

単純な v.setEnabled(false); 私の問題を解決しました

 popupName.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {


                     popupName.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {


                v.setEnabled(false);
                performAction(v, activity);

            }
        }); 

        popupmain.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {


                v.setEnabled(false);
                performAction(v, activity);

            }
        }); 
                    performAction(v, activity);

                }
            }); 

            popupmain.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {


                    v.setEnabled(false);
                    performAction(v, activity);

                }
            }); 
于 2013-01-23T11:01:54.780 に答える