2014-04-01 87 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

我已經用前面告訴過的修改更新了代碼。 –