2013-01-23 24 views
-1

在我的应用程序中,我有一个弹出式菜单,当我点击menuitem它收集gps位置时,问题是当我双击菜单触发两次,但我只做onclick 确定我在做错的地方Android: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> 
+0

把你的xml在你的问题请 – ibrahimyilmaz

+0

不知道为什么你有两个'onClickListeners'执行相同的任务,其中只有一个在'popupmain'应该是足够的,但每一个他自己的,我想。无论如何,为什么不使用布尔标志并通过在'public void doAction()'的开始处设置_true_并在'private void getLocation()'的末尾将其设置为false来检查任务是否正在运行?在调用'doAction(v,activity);'之前检查'OnClickListener's'中的标志状态。我认为这应该做到这一点。 –

+0

你可以用代码 – teekib

回答

0

简单v.setEnabled(假);解决我的问题

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); 

       } 
      }); 
0

让您的“弹出菜单”实例作为私有类成员和检查调用“doAction()”

+0

对不起,我没有得到你,你可以解释更多。 – teekib

+0

popupMenu已经是私人的 – teekib

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

+0

张贴我的布局..是否都在同一布局..如何避免这种情况? – teekib

+0

@teekib编辑我的答案。如果我是你,我宁愿扩展我的LinearLayout因为干净的代码。 – ibrahimyilmaz

+0

这里popupMainOpened是什么? – teekib

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 LinearLayout而不是popupName TextView

+0

我实现了你的代码,但仍然面临同样的问题..布局打开两次 – teekib

+0

@teekib:哪个布局打开两次? “ListView”项目上的弹出窗口? –

+0

..yes弹出一个ListView项目 – teekib