2014-04-01 80 views
0

我正在创建一个Android应用程序,该应用程序实现拖放操作以在不同位置放置视图。代码运行完美,但有一个小故障。有时当我拖动一个视图时,它会突然隐藏起来,或者从相应的活动中看不见。为了让它回到活动中,我必须重新加载活动,方法是返回到上一个并再次返回。拖放从布局中删除视图

的阻力监听器的代码如下:

public class MyDragListener implements View.OnDragListener 
{ 
    @Override 
    public boolean onDrag(View v, DragEvent event) { 
     // TODO Auto-generated method stub 
     switch (event.getAction()) { 
     case DragEvent.ACTION_DRAG_STARTED: 
      return false; 
     case DragEvent.ACTION_DRAG_ENTERED: 
      return false; 
     case DragEvent.ACTION_DROP: 
      view=(View)event.getLocalState(); 
      int h = view.getHeight(); 
      int w = view.getWidth(); 
      h=h/2; 
      w=w/2; 
      if((event.getX()-w)<0||(event.getY()-h)<0){ 
      }else if((event.getX()+w)>width||(event.getY()+h)> height){ 
      } 
      else{ 
      view.setX(event.getX()-w); 
      view.setY(event.getY()-h); 
      owner = (ViewGroup) view.getParent(); 
      owner.removeView(view); 
      RelativeLayout container=(RelativeLayout)v; 
      container.addView(view); 
      relativeLayout.removeAllViews(); 
      relativeLayout.addView(text_name); 
      relativeLayout.addView(text_dob); 
      relativeLayout.addView(edit_name); 
      relativeLayout.addView(edit_dob); 
      relativeLayout.invalidate(); 
      view.invalidate(); 
      text_name.invalidate(); 
      text_dob.invalidate(); 
      edit_name.invalidate(); 
      edit_dob.invalidate(); 
      } 
      return true; 
     case DragEvent.ACTION_DRAG_ENDED: 
      return false; 
     case DragEvent.ACTION_DRAG_EXITED: 
      return false; 
     default: 
      return false; 
     } 
    } 

} 

触摸监听器的代码如下:

public class MyTouchListenerForEditText implements OnTouchListener 
{ 
    @Override 
    public boolean onTouch(View view, MotionEvent event) { 
     // TODO Auto-generated method stub 

     int action = event.getAction() & MotionEvent.ACTION_MASK; 
     if(action==MotionEvent.ACTION_UP) 
     { 
      time_up=System.currentTimeMillis(); 
      if(time_up-time_down<2000) 
      {  
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
          imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT); 
          ((EditText)view).setInputType(InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE|InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE); 
          view.requestFocus(); 
          ((EditText)view).setSelection(((EditText)view).getText().length()); 
       } 
      } 
     } 
     else if(action==MotionEvent.ACTION_MOVE) 
     { 

       ClipData data = ClipData.newPlainText("", ""); 
       DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(
         view); 
       view.startDrag(data, shadowBuilder, view, 0); 
       view.setVisibility(View.INVISIBLE); 

     } 
     else if(action==MotionEvent.ACTION_DOWN) 
     { 
      edit_name.setInputType(InputType.TYPE_NULL|InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE); 
      edit_dob.setInputType(InputType.TYPE_NULL|InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE); 
      edit_hobbies.setInputType(InputType.TYPE_NULL|InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE); 
      edit_ideal_person.setInputType(InputType.TYPE_NULL|InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE); 
      edit_strengths.setInputType(InputType.TYPE_NULL|InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE); 
      edit_weakness.setInputType(InputType.TYPE_NULL|InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE); 

      time_down=System.currentTimeMillis(); 
      return true; 
     } 
     return false; 
    } 
} 

也请让我知道我们是否可以实现拖动和上落动态添加视图到任何活动?

回答

0

请考虑以下。它可能会帮助你:

  1. 不要设置视图的可见性来隐藏它。将其添加到“容器”中并从“relativeLayout”中移除后,为源视图和目标视图调用View.invalidate()。它会根据需要重新绘制视图。
  2. 在onDrag()方法中,仅在ACTION_DROP中返回您正在执行工作的地方的true。在所有其他情况下返回false。
+0

谢谢,它解决了我的这个问题。我在同一个代码中面临更多问题。每当我将edittext拖到另一个edittext上时,被拖动的edittext就会不可见。你能告诉我为什么发生这种情况吗? –

+0

你能分享修改过的代码吗?让我们试着弄清楚现在发生了什么。 – Abdul

+0

我已经用前面告诉过的修改更新了代码。 –