【问题标题】:drag and drop across layouts in android在android中跨布局拖放
【发布时间】:2016-08-07 10:09:29
【问题描述】:

我有一个线性布局(我称之为子布局)和一个线性布局内的一个相对布局。我想将项目从相对布局拖放到子线性布局 我怎样才能做到这一点?我无法在布局之间拖放

【问题讨论】:

    标签: android drag-and-drop


    【解决方案1】:

    我正在努力拖延自己,但我可以提出建议。您需要忘记使用标准 main.xml 并使用内部类在代码中完成所有操作。这并不难,内部类可以看到父监听器。

    private MotionEvent ev;
    TextView mainText;
    LinearLayout layout;
    KeyboardView keyboard;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        layout = new LinearLayout(this);
        layout.setOrientation(LinearLayout.VERTICAL);
        KeyboardView keyboard = new KeyboardView(this);
    
        mainText = new TextView(this);
        mainText.setText("The main text. ");
        mainText.setHeight(120);
        mainText.setBackgroundColor(Color.LTGRAY);
        mainText.setTextColor(Color.BLACK);
        layout.addView(mainText);
    
        layout.addView(keyboard);
    
        setContentView(layout);
    
    }
    
        public class KeyboardView extends View {
         .
         .
         .
        }
    

    克里斯

    【讨论】:

      【解决方案2】:

      在您的情况下为“DragEvent.ACTION_DROP”,您应该验证您的视图是 LinerLayour 还是 RelativLayout。您可以使用“instanceof”轻松验证这一点。

      这可能是解决方案:

      public class MyDragListener implements OnDragListener {
       @Override
       public boolean onDrag(View v, DragEvent event) {
      
         int action = event.getAction();
         switch ( action ) {
         case DragEvent.ACTION_DRAG_STARTED:
           break;
         case DragEvent.ACTION_DRAG_ENTERED:
           break;
         case DragEvent.ACTION_DRAG_EXITED:
           break;
         case DragEvent.ACTION_DROP:
           View view = (View) event.getLocalState();
           ViewGroup owner = (ViewGroup) view.getParent();
           owner.removeView(view);
           if(v instanceof RelativLayout){
             RelativeLayout container = (RelativeLayout) v;
           } else {
             LinearLayout container = (LinearLayout) v;
           }
           container.addView(view);
           view.setVisibility(View.VISIBLE);
           break;
         case DragEvent.ACTION_DRAG_ENDED:
           break;
         case DragEvent.ACTION_DRAG_LOCATION:
           break;
         }
       }
      }
      

      【讨论】:

        【解决方案3】:

        这会有所帮助

        private final class MyTouchListener implements OnTouchListener {
            public boolean onTouch(View view, MotionEvent motionEvent) {
                if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
                    ClipData data = ClipData.newPlainText("", "");
                    View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
                    view.startDrag(data, shadowBuilder, view, 0);
                    view.setVisibility(View.INVISIBLE);
                    return true;
                } else {
                    return false;
                }
            }
        }
        
        class MyDragListener implements OnDragListener {
            Drawable enterShape = getResources().getDrawable(R.drawable.shape_droptarget);
            Drawable normalShape = getResources().getDrawable(R.drawable.bg);
        
            @Override
            public boolean onDrag(View v, DragEvent event) {
                int action = event.getAction();
                switch (event.getAction()) {
                    case DragEvent.ACTION_DRAG_STARTED:
                        // Do nothing
                        break;
                    case DragEvent.ACTION_DRAG_ENTERED:
                        v.setBackgroundDrawable(enterShape);
                        break;
                    case DragEvent.ACTION_DRAG_EXITED:
                        v.setBackgroundDrawable(normalShape);
                        break;
                    case DragEvent.ACTION_DROP:
                        // Dropped, reassign View to ViewGroup
                        View view = (View) event.getLocalState();
                        ViewGroup owner = (ViewGroup) view.getParent();
                        owner.removeView(view);
                        RelativeLayout container = (RelativeLayout) v;
                        container.addView(view);
                        view.setVisibility(View.VISIBLE);
                        break;
                    case DragEvent.ACTION_DRAG_ENDED:
                        v.setBackgroundDrawable(normalShape);
                    default:
                        break;
                }
                return true;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2012-06-30
          • 2020-04-22
          • 1970-01-01
          • 2019-10-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-11-20
          相关资源
          最近更新 更多