2012-03-29 12 views
1

何私のアプリが行うことは非常に簡単です:Androidのドラッグ&ICS(4.0.3)上の画像のクラッシュをドロップ

それは、GridViewの 上のSDカードとの角にあるアイコン上のすべての画像のサムネイル画像を表示しますこれらのサムネイルは、ユーザーが画像の影をドラッグして開始するために触れることができるように、 です。

このシャドウは、ドラッグリスナーを設定したビューにドロップすることができます。その が発生すると、新たなインテントが 新しいインテントのための余分なイメージファイルパスUriで呼び出されます。ここまでは順調ですね。

ドラッグリスナーがないビューでシャドーを開始すると、問題が発生し、最終的に画面がフリーズし、モバイルデバイスがクラッシュします。

私はスタックトレースを取得するすべてのはこれです:

03-29 14:24:14.803: I/ViewRootImpl(2496): Reporting drop result: false 
03-29 14:24:14.803: W/WindowManager(274): Drag is in progress but there is no drag window handle. 
03-29 14:24:15.062: I/ViewRootImpl(2496): Reporting drop result: false 
03-29 14:24:15.062: W/WindowManager(274): Drag is in progress but there is no drag window handle. 
03-29 14:24:15.294: I/ViewRootImpl(2496): Reporting drop result: false 
03-29 14:25:06.972: I/Process(274): Sending signal. PID: 274 SIG: 3 
03-29 14:25:06.972: I/dalvikvm(274): threadid=3: reacting to signal 3 
03-29 14:25:07.092: I/dalvikvm(274): Wrote stack traces to '/data/anr/traces.txt' 
03-29 14:25:10.012: W/ActivityManager(274): Timeout of broadcast BroadcastRecord{2c09ce28 android.intent.action.TIME_TICK} - [email protected]2bf0c4e8, started 10009ms ago 
03-29 14:25:10.012: W/ActivityManager(274): Receiver during timeout: BroadcastFilter{2bf0cd08 ReceiverList{2bf0c660 274 system/1000 local:2bf0c4e8}} 
03-29 14:25:20.022: W/ActivityManager(274): Timeout of broadcast BroadcastRecord{2c09ce28 android.intent.action.TIME_TICK} - [email protected]2bef04e8, started 10008ms ago 
03-29 14:25:20.022: W/ActivityManager(274): Receiver during timeout: BroadcastFilter{2bef0760 ReceiverList{2bef06e8 274 system/1000 local:2bef04e8}} 
03-29 14:25:37.092: W/Watchdog(274): WATCHDOG PROBLEM IN SYSTEM SERVER: com.android.server.wm.WindowManagerService 
03-29 14:25:37.102: I/Process(274): Sending signal. PID: 274 SIG: 3 
03-29 14:25:37.102: I/dalvikvm(274): threadid=3: reacting to signal 3 
03-29 14:25:37.182: I/dalvikvm(274): Wrote stack traces to '/data/anr/traces.txt' 
03-29 14:25:37.192: I/Process(274): Sending signal. PID: 475 SIG: 3 
03-29 14:25:37.192: I/dalvikvm(475): threadid=3: reacting to signal 3 
03-29 14:25:37.202: I/dalvikvm(475): Wrote stack traces to '/data/anr/traces.txt' 
03-29 14:25:39.204: I/Watchdog_N(274): dumpKernelStacks 
03-29 14:25:39.492: I/CrashMonitor(1186): CrashMonitorService: invokeService: android.intent.action.DROPBOX_ENTRY_ADDED 
03-29 14:25:39.492: W/Watchdog(274): *** WATCHDOG KILLING THE SYSTEM: com.android.server.wm.WindowManagerService 

マイアダプタクラス(ここで、iはview.startDrag()メソッドを実行):

public class ImageCursorAdapter extends CursorAdapter { 

    private LayoutInflater mInflater; 
    private final static int mImageColumnID = 0; 
    private Options mOptions = new Options();; 
    private Cursor mCursor; 

    public ImageCursorAdapter(Context context, Cursor c) { 
     super(context, c); 

     mInflater = LayoutInflater.from(context); 
     mOptions.inSampleSize = 4; 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 
     mCursor = cursor; 
     ViewHolder holder = (ViewHolder) view.getTag(); 
     ImageThumbnailLoader imageLoader = new ImageThumbnailLoader(
      holder.thumbImg, cursor.getLong(mImageColumnID), 
      context.getContentResolver(), false); 
     imageLoader.execute(); 
//  holder.thumbImg.setImageBitmap(MediaStore.Images.Thumbnails.getThumbnail(
//     context.getContentResolver(), cursor.getLong(mColumnID), 
//     MediaStore.Images.Thumbnails.MICRO_KIND, mOptions)); 
     holder.dragImg.setTag(holder.thumbImg); 
     holder.dragImg.setId(cursor.getPosition()); 
     holder.dragImg.setOnTouchListener(new OnTouchListener() { 

      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       int action = event.getAction(); 
       if (action == MotionEvent.ACTION_DOWN) { 
        mCursor.moveToPosition(v.getId()); 
        int dataColumn = mCursor.getColumnIndex(MediaStore.Images.Media.DATA); 
        ClipData dragData = ClipData.newPlainText("filename", 
         mCursor.getString(dataColumn)); 
        DragShadowBuilder shadow = new DragShadowBuilder((View) v.getTag()); 
        return v.startDrag(dragData, shadow, null, 0); 
       } 
       return false; 
      } 
     }); 
     Log.i("Prototype", "bindView : " + cursor.getPosition()); 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     Log.i("Prototype", "newView : " + cursor.getPosition()); 
     View view = mInflater.inflate(R.layout.grid_item, null); 
     ViewHolder holder = new ViewHolder(view); 
     view.setTag(holder); 
     return view; 
    } 


    private static class ViewHolder { 
     ImageView thumbImg, dragImg; 

     ViewHolder(View base) { 
      thumbImg = (ImageView) base.findViewById(R.id.thumbImage); 
      dragImg = (ImageView) base.findViewById(R.id.dragImage); 
     } 
    } 

} 

what`上の任意のアイデア/手がかりここにいる?私は本当にこれに手を差し伸べていただきたいと思います。

ありがとうございます。

答えて

1

'onDrag(View v、DragEventイベント)'メソッドにswitch case文がある場合、 'DragEvent.ACTION_DRAG_LOCATION'というケースを追加する必要があります。アイコン/イメージがNON-Dragフィールドに置かれている場合、何が起こるべきかを定義することができます。ここで

は一例です:

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); 
     RelativeLayout container = (RelativeLayout) v; 
     container.addView(view); 
     view.setVisibility(View.VISIBLE); 
     break; 
    case DragEvent.ACTION_DRAG_ENDED: 
        break; 
    case DragEvent.ACTION_DRAG_LOCATION: 
     view.setVisibility(View.VISIBLE); 
     break; 
    } 
    } 

} 
+0

私はこのクラスを自分のクラスに実装していますが、フリーズはまだ発生しています。 アイコンを何度もドラッグしようとすると、必ずしもそのようなことは起こりません。 – ImNotAnUser

+0

@ImNotAnUserこれを解明しましたか? – DJayC

+0

@DJayCいいえ、私はしませんでした。自分のドラッグアンドドロップのフレームワークを実装し終わった。 – ImNotAnUser

1

私はドロップアクションを受け入れるようにレイアウトをしたくなかったという点で、同様の問題に遭遇しました。

setOnDragListener経由でビューにドラッグリスナーをアタッチします。

view.setOnDragListener(new MyDragListener());

onDragイベントのターゲットビューが必要なビューであるかどうかを確認します。条件が偽の場合は、目的のコードをそこに置きます。

class MyDragListener implements OnDragListener { 

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

    switch (event.getAction()) { 
    case case DragEvent.ACTION_DROP: 
     //check whether it has not been dropped onto your view 
      if(v!=view) 
       //your code here 
} 
関連する問題