2013-12-18 2 views
1

После прочтения десятков Q & A относительно предмета, я не смог найти ответ на эту ситуацию.setImageDrawable не устанавливает текущий выталкиваемый

В моем приложении пользователь перетаскивает разные значки из одного табличного макета в другой (нижняя таблица выглядит как «клавиатура значка»).

После перетаскивания значка в верхнюю таблицу (он заменяет изображение заполнителя) пользователь должен уметь перетаскивать его туда в разные места.

Прямо сейчас, первая часть работает отлично. Я могу перетаскивать значки с «клавиатуры» в верхнюю таблицу. но по какой-то причине, когда я пытаюсь перетащить его между разными местоположениями внутри этого макета, imageView, который должен измениться на значок, остается с тем же drawable (placeholder).

public boolean onDrag(View v, DragEvent event) { 
     ImageView imageOnBoard = (ImageView) v; 
     switch (event.getAction()) { 
     case DragEvent.ACTION_DRAG_STARTED: 
       break; 
     case DragEvent.ACTION_DRAG_ENTERED: 
      imageOnBoard.setBackgroundColor(0xFF00FF00); 

     break; 
     case DragEvent.ACTION_DRAG_EXITED: 
      imageOnBoard.setBackgroundColor(color.transparent); 
      imageOnBoard.setOnTouchListener(null); 
     break; 
     case DragEvent.ACTION_DROP:   


     imageOnBoard.setBackgroundColor(color.transparent); 
     TableRow tr1 = (TableRow) imageOnBoard.getParent(); 
     int r=tr1.indexOfChild(imageOnBoard); 
     TableLayout tl1 = (TableLayout) tr1.getParent(); 
     int c=tl1.indexOfChild(tr1); 


     ImageView strategyIcon = (ImageView) (event.getLocalState()); 
     TableLayout source = (TableLayout) strategyIcon.getParent().getParent(); 
     if (source.equals((TableLayout) findViewById(R.id.tableLayout))) 
     { 

      Drawable draw = strategyIcon.getDrawable(); 
      imageOnBoard.setImageDrawable(draw); 

     } 
     else 
     { 

      Drawable draw = strategyIcon.getDrawable(); 
      imageOnBoard.setImageDrawable(draw); 

     } 


     imageOnBoard.setVisibility(View.VISIBLE); 
     imageOnBoard.setOnTouchListener(new MyTouchListener()); 

     break; 
     case DragEvent.ACTION_DRAG_ENDED: 

      break; 

     default: 
     break; 
     } 
     return true; 
    } 

, как вы можете видеть, я разделить действие DRAG_DROP в двух случаях (перетаскиванием из «клавиатуры» и тащат в верхней макете. Я проверил его, и он перейдет в разных случаях, но рисую объект, кажется, «unupdated».

Пожалуйста, помогите!

теперь я понимаю, что проблема при извлечении вытяжки (getDrawable) во второй раз, от верхнего расположения, я не получать текущий, но оригинальный. Как я могу это обработать?

ответ

0

как метод setImageDrawable() устарел на уровне api 16, таким образом, этот метод не будет работать. Вместо этого вы можете использовать следующий метод

@SuppressWarnings("deprecation") 
    private void setRes(ImageView iv,Drawable drawable){ 
     if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) 
      iv.setBackground(drawable); 
     else 
      iv.setBackgroundDrawable(drawable); 
    } 

для реф # http://developer.android.com/reference/android/view/View.html#setBackground(android.graphics.drawable.Drawable)

+0

Это не решило проблему. кроме того, метод работает во втором случае, так почему он не должен работать над первым? – Maoritzio

+0

это зависит от устройства, если ваше устройство находится выше уровня api 15, тогда первый случай будет выполнен, иначе будет выполняться второй случай. –

+0

Что я имел в виду, так это то, что инструкция else в моем коде (а не в предложенном вами ответе) выполняется и работает нормально, и она эквивалентна выражению «if», так почему бы им не работать? – Maoritzio

0

Разве это не только простая ошибка? здесь вы получаете «draw» Drawable, но вы ничего с этим не делаете. Может заменить:

if (source.equals((TableLayout) findViewById(R.id.tableLayout))) 
     { 
      //imageOnBoard.setImageResource(strategyIcon.getId()); 
      Drawable draw = strategyIcon.getDrawable(); 
      imageOnBoard.setImageDrawable(getResources().getDrawable(R.drawable.ic_launcher)); 

     } 

By:

if (source.equals((TableLayout) findViewById(R.id.tableLayout))) 
      { 
       Drawable draw = strategyIcon.getDrawable(); 
       imageOnBoard.setImageDrawable(draw); 

      } 
+0

Извините, я вставил неправильный код, я его отредактировал сейчас – Maoritzio

0

Проблема была acctualy с getDrawable, предоставившего старый вытяжке. это было зафиксировано с помощью метки:

if (source.equals((TableLayout) findViewById(R.id.tableLayout))) //in case this icon is dragged from the board 
     { 


      Drawable draw = (Drawable) strategyIcon.getTag(); 
      imageOnBoard.setImageDrawable(draw); 
      imageOnBoard.setTag(draw); 

     } 




     else               //in case this icon is dragged from the menu 
     { 
      Drawable draw = strategyIcon.getDrawable(); 
      imageOnBoard.setImageDrawable(draw); 

      imageOnBoard.invalidateDrawable(draw); 
      imageOnBoard.setTag(draw); 

     } 
1

я встретил то же проблему, когда я установил изображение в ImageView с помощью image1.setImageDrawable(add); иногда он не работает, позже я использовал скольжение, чтобы установить изображение: например Glide.with(Activity.this).load(R.drawable.add).into(image1); тогда он отлично работает

0

Я столкнулся с той же проблемой, и моим решением было установить LayoutParams изображения перед «setImageDrawable». По-видимому, поскольку drawable не имеет размера (особенно, если он является настраиваемым или какой-либо иконкой) отображается как нулевая длина по ширине и высоте на экране. Решение поэтому:

SemiCircleDrawable d = new SemiCircleDrawable(...); // just a custom drawable 

myImage.setLayoutParams(newLinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); 
myImage.setImageDrawable(d); 
Смежные вопросы