0

私はこの数日間、このプログラムで苦労してきました。私が直面している問題は、別のビューを除外するビューのドロップイベントに関するものです。プログラムが行うことになっているのは、ボタンをクリックするだけで、いくつものImageButtonを作成し、それらすべてを画面上のどこにでもドラッグアンドドロップできることです。ただし、彼は最初のビューを作成し、2番目のビューを作成しますが、2番目のImageButtonをドラッグすると、最初に作成されたビューが画面から削除されます。

これがXMLです

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/relative_main"
    tools:context=".WhyItActivity" >

<Button 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="add button"
    android:onClick="addButton"  />
 </RelativeLayout>

以下は、責任のあるJavaアクティビティです。

public class WhyItActivity extends Activity {

private RelativeLayout relative;
private LayoutParams params;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_why_it);

    params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    relative = (RelativeLayout)findViewById(R.id.relative_main);

    // all the screen be a dropping area
    relative.setOnDragListener(new View.OnDragListener() {

        @Override
        public boolean onDrag(View view, DragEvent event) {

            View dragView = (View) event.getLocalState();
            RelativeLayout layout = (RelativeLayout) view;

            switch (event.getAction()) {
            case DragEvent.ACTION_DRAG_STARTED:
                break;
            case DragEvent.ACTION_DRAG_ENTERED:
                break;
            case DragEvent.ACTION_DRAG_EXITED:
                break;
            case DragEvent.ACTION_DROP:

                int right = (int)event.getX(); 
                int top = (int)event.getY(); 
                params.setMargins(right, top, 0, 0);
                layout.removeView(dragView);
                layout.addView(dragView, params);
                // set back the visibility
                dragView.setVisibility(View.VISIBLE);
                break;

            case DragEvent.ACTION_DRAG_ENDED:
                break;
            default:
                break;
            }

            return true;
        }
    });
}

/** OnClick */
public void addButton(View v){
    // params for centralizing the image button
    LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    params.addRule(RelativeLayout.CENTER_IN_PARENT);
    // new object
    ImageButton imgBtn = new ImageButton(this);
    imgBtn.setImageDrawable(getResources().getDrawable(R.drawable.ic_launcher));
    relative.addView(imgBtn, params);
    // letting the view be dragged around the screen
    imgBtn.setOnLongClickListener(new View.OnLongClickListener() {

        @Override
        public boolean onLongClick(View view) {
            ClipData data = ClipData.newPlainText("", "");
            DragShadowBuilder builder = new View.DragShadowBuilder(view);
            view.startDrag(data, builder, view, 0);
            // let the view be invisible while dragging the object
            view.setVisibility(View.INVISIBLE);
            return true;
        }
    });

}

だから、質問は...私がどこをねじ込んでいるのですか?新しいオブジェクトを作成します。画面を1回表示するだけで問題がなければ、問題なく機能します。

これまで読んでくれてありがとう、そしておそらく助けることができるでしょう。

4

1 に答える 1

2

One silly but critical mistake.

Add this line

params = params = new LayoutParams(LayoutParams.WRAP_CONTENT,
                            LayoutParams.WRAP_CONTENT);

Above

params.setMargins(right, top, 0, 0);

As u can see there is only one instance of LayoutParam you have been assigning to all your views, thus ending up in stack of views.

Please mark as accepted if resolved. Thanks.

于 2013-01-25T18:12:51.733 に答える