在阅读了几十篇关于这个主题的问答后,我找不到这种情况的答案。
在我的应用中,用户将不同的图标从一个表格布局拖动到另一个表格布局(底部表格布局是一种“图标键盘”)。
将图标拖到上面的表格后(它会替换占位符图像),用户应该可以继续拖动它到不同的位置。
现在,第一部分很有效。我可以将图标从“键盘”拖动到上面的表格布局中。但出于某种原因,当我尝试在此布局中的不同位置之间拖动它时,应该更改为图标的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;
}
正如你所看到的,我将DRAG_DROP动作分为两种情况(从“键盘”拖动并拖动上部布局。我测试了它,它确实进入了不同的情况,但是可绘制的对象似乎“没有更新”。
请帮忙!
我现在明白问题是第二次提取Drawable(getDrawable)时,从上层布局,我没有收到当前的drawable,而是原来的drawable。我怎么处理这个?
答案 0 :(得分:1)
我遇到同样的问题,当我使用image1.setImageDrawable(add);
将Image设置为ImageView时有时它不起作用,后来我使用滑动来设置图像:
例如Glide.with(Activity.this).load(R.drawable.add).into(image1);
然后它工作正常
答案 1 :(得分: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);
}
答案 2 :(得分:0)
这个问题与getDrawable有关,它提供了旧的Drawable。 这是使用Tags:
修复的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);
}
答案 3 :(得分:0)
我遇到了同样的问题,我的解决方案是在“setImageDrawable”之前设置图像的LayoutParams。显然,因为drawable没有尺寸(特别是,如果它是一个自定义可绘制或一些图标)在屏幕中显示为零长度的宽度和高度。 因此,解决方案是:
SemiCircleDrawable d = new SemiCircleDrawable(...); // just a custom drawable
myImage.setLayoutParams(newLinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
myImage.setImageDrawable(d);
答案 4 :(得分:-1)
因为在api级别16中不推荐使用setImageDrawable()方法,所以此方法不起作用。相反,您可以使用以下方法
@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);
}