14521


動的に追加したviewをドラッグ出来るようにしているのですが、  
View.layoutで設定した座標が、layoutにaddViewした時点でリセットされてしまいます。  
コレを回避する方法は無いでしょうか？

[code]

    public static class PlaceholderFragment extends Fragment {
        private static final String ARG_SECTION_NUMBER = "section_number";
        public Activity mActivity;
        public RelativeLayout layout;
    
        public PlaceholderFragment() {}
    
        public static PlaceholderFragment newInstance(int sectionNumber) {
            PlaceholderFragment fragment = new PlaceholderFragment();
            Bundle args = new Bundle();
            args.putInt(ARG_SECTION_NUMBER, sectionNumber);
            fragment.setArguments(args);
            return fragment;
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_main, container,
                    false);
    
            layout = (RelativeLayout) rootView.findViewById(R.id.layout);
    
            ImageView dragView = (ImageView) rootView.findViewById(R.id.imageView1);
            DragViewListener listener = new DragViewListener(dragView);
            dragView.setOnTouchListener(listener); 
    
            return rootView;
        }
    
    
        public void addImageView(){
            ImageView v = new ImageView(mActivity);
            //v.setL
            layout.addView(v, new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT));
            v.setImageDrawable( mActivity.getResources().getDrawable(R.drawable.ueki));
            DragViewListener listener = new DragViewListener(v);
            v.setOnTouchListener(listener);
    
        }
    
    
        //ドラッグイベント処理
        public class DragViewListener implements OnTouchListener {
            // ドラッグ対象のView
            private ImageView dragView;
            // ドラッグ中に移動量を取得するための変数
            private int oldx;
            private int oldy;
    
            public DragViewListener(ImageView dragView) {
                this.dragView = dragView;
            }
    
            @Override
            public boolean onTouch(View view, MotionEvent event) {
                int x = (int) event.getRawX();
                int y = (int) event.getRawY();
    
                switch (event.getAction()) {
                case MotionEvent.ACTION_MOVE:
                    int left = dragView.getLeft() + (x - oldx);
                    int top = dragView.getTop() + (y - oldy);
                    dragView.layout(left, top, left + dragView.getWidth(), top
                            + dragView.getHeight());
                    break;
                }
                oldx = x;
                oldy = y;
                return true;
            }
    
        }
    
        @Override
        public void onAttach(Activity activity) {
            super.onAttach(activity);
            ((MainActivity) activity).onSectionAttached(getArguments().getInt(
                    ARG_SECTION_NUMBER));
            mActivity = activity;
        }
    }
    
[/code]


CC BY-SA 3.0
2015-08-17T07:32:13.477
14518
2015-08-17T10:32:00.240
525
question
android android-layout
addView時にドラッグしたViewがリセットされてしまう


`View#layout()`は`View`の表示位置を変更しますが、これは本来親の`ViewGroup`が各々の子の`View`のレイアウトパラメータから位置を計算してから呼び出すものです。レイアウトパラメータそのものを変えるものではありません。

動的に`View`を追加した場合、親の`ViewGroup`はオリジナルのレイアウトパラメータから再度位置を計算しようとします。そのため、元の位置に戻ります。

例えば以下のようなコードを追加して、`ACTION_UP`のタイミングでレイアウトパラメータを更新する処理を入れてみてはどうでしょうか？

[code]

    case MotionEvent.ACTION_UP:
        RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
         lp.setMargins(dragView.getLeft(), dragView.getTop(), 0, 0);
         dragView.setLayoutParams(lp);
         break;
    
[/code]


CC BY-SA 3.0
2015-08-17T09:00:24.680
14521
2015-08-17T10:32:00.240
2015-08-17T10:32:00.240
5337
5337
14518
answer