2013-12-18 36 views
1

在阅读了关于该主题的几十个Q & A之后,我无法找到这种情况的答案。setImageDrawable未设置当前可绘制的

在我的应用程序中,用户将不同的图标从一个表格布局拖动到另一个表格布局(底部表格布局是一种“图标键盘”)。

将图标拖动到上表(它将替换占位符图像)后,用户应该可以继续将其拖动到不同的位置。

现在,第一部分工作很好。我可以将图标从“键盘”拖到上表格布局中。但出于某种原因,当我尝试在此布局中的不同位置之间拖动它时,应该更改为图标的imageView与相同的drawable(占位符)保持一致。

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; 
    } 

,你可以看到,我devided的DRAG_DROP作用到两个案例(从“键盘”拖和上布局里面拖。我测试了它,它不会进入不同的情况,但可绘制的对象似乎是“未更新”。

请帮帮忙!

我现在明白了,问题是,而第二次提取绘制对象(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

我的意思是我的代码中的其他语句(不是你所建议的答案中)被执行并且工作正常,并且它相当于“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)); 

     } 

通过:

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

我遇见同样的问题,当我设置图像到使用image1.setImageDrawable(add);有时它不工作一ImageView的,后来我用滑行设置图像: 例如Glide.with(Activity.this).load(R.drawable.add).into(image1); 那么它工作正常

0

我遇到了同样的问题,我的解决方案是在“setImageDrawable”之前设置图像的LayoutParams。显然,由于drawable没有大小(特别是,如果它是自定义drawable或某个图标)在屏幕中的宽度和高度显示为零长度。 因此,解决方案是:

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

myImage.setLayoutParams(newLinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); 
myImage.setImageDrawable(d); 
相关问题