Android &引用;java.lang.IllegalArgumentException:视图未附加到窗口管理器";叫吐司的时候
我得到以下“java.lang.IllegalArgumentException:视图未附加到窗口管理器”” 调用toast.show()时会发生这种情况 请解释一下?非常感谢 编辑:我发布所有代码+日志 代码-请注意,在侦听器中调用toast.show()时会发生错误Android &引用;java.lang.IllegalArgumentException:视图未附加到窗口管理器";叫吐司的时候,android,android-gallery,onitemclicklistener,android-adapterview,Android,Android Gallery,Onitemclicklistener,Android Adapterview,我得到以下“java.lang.IllegalArgumentException:视图未附加到窗口管理器”” 调用toast.show()时会发生这种情况 请解释一下?非常感谢 编辑:我发布所有代码+日志 代码-请注意,在侦听器中调用toast.show()时会发生错误 public class MainActivity extends Activity { private Gallery gal; @Override protected void onCreate(
public class MainActivity extends Activity {
private Gallery gal;
@Override
protected void onCreate(Bundle savedInstanceState) {
String[] descrizione = {"cani","boffo","gigo","belo","fyyfy","bogin","boginetti","zippe","ninne","cestino","cagnin o","cucciolo",};
ArrayList<Elementi> el = new ArrayList<Elementi>(10);
int[] tabDrawables = new int[] {
R.drawable.img1,R.drawable.img2,R.drawable.img3,R.drawable.img1,R.drawable.img4,R.drawable. img5,R.drawable.img6,R.drawable.img7,R.drawable.img8,R.drawable.img9,R.drawable.img10};
for (int numero =1; numero < 10;numero++) {
ImageView imgm = new ImageView(this);
imgm.setImageResource(tabDrawables[numero]);
el.add(new Elementi(imgm,descrizione[numero]));
};
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Gallery gal=(Gallery)findViewById(R.id.galleria);
gal.setAdapter(new MyAdapter(el));
gal.setOnItemClickListener(new MyListener(this));
}
public class MyAdapter extends ArrayAdapter<Elementi> {
public MyAdapter(ArrayList<Elementi> list) {
super(MainActivity.this, R.layout.row, list);}
public View getView(int position, View convertView,ViewGroup parent) {
View row= convertView;
if(row==null){
LayoutInflater inflater = (LayoutInflater) MainActivity.this.getSystemService( Context.LAYOUT_INFLATER_SERVICE );
row = inflater.inflate(R.layout.row, null);
}
TextView txt =(TextView)row.findViewById(R.id.testorow);
txt.setText(getItem(position).tx) ;
ImageView ima =(ImageView)row.findViewById(R.id.immagine);
ima.setImageDrawable(getItem(position).im.getDrawable());
return row;};
}
public class Elementi {
public ImageView im;
public String tx;
public Elementi(ImageView img,String txt){
im =img;
tx = txt;
}
}
public class MyListener implements AdapterView.OnItemClickListener {
private final Context mContext;
public MyListener(Activity ctx) {
mContext = ctx;
}
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
Toast toast = new Toast(mContext);
toast.setView(arg1);
toast.show();
}}
}
这是因为您的
arg1
视图已经有一个父视图(图库)…并且一个视图只能有一个父视图
这意味着您不能将其附加到
Toast
,除非您先将其从库中删除,这是因为您的arg1
视图已经有一个父视图(库)…并且一个视图只能有一个父视图
这意味着您无法将其附加到
Toast
,除非您先将其从库中删除我认为问题在于此Toast.setView(arg1)的代码代码>因为同一视图不能附加到多个对象。因为此视图已附加到库项目
更新
您只需使用当前视图的相同值通过layoutInflator
重新创建该视图,然后将此新视图传递给Toast。我认为问题在于此Toast.setView(arg1)的代码代码>因为同一视图不能附加到多个对象。因为此视图已附加到库项目
更新
您只需使用当前视图的相同值通过layoutInflator
重新创建该视图,然后将此新视图传递给Toast。对于UI内容,不要使用“getApplicationContext()”,而是使用活动上下文。
例如
更好的做法是在活动中实现AdapterView.OnItemClickListener以简化事情:
public class MainActivity implements AdapterView.OnItemClickListener {
//start onCreate
gal.setOnItemClickListener(this);
//end onCreate
@Override
public void onItemClick(AdapterView arg0, View arg1, int arg2, long arg3) {
Toast toast = new Toast(this);
toast.setView(arg1);
toast.show();
}}
如果这不能解决问题,请使用堆栈跟踪更新您的问题。对于UI内容,不要使用“getApplicationContext()”,而是使用活动上下文。
例如
更好的做法是在活动中实现AdapterView.OnItemClickListener以简化事情:
public class MainActivity implements AdapterView.OnItemClickListener {
//start onCreate
gal.setOnItemClickListener(this);
//end onCreate
@Override
public void onItemClick(AdapterView arg0, View arg1, int arg2, long arg3) {
Toast toast = new Toast(this);
toast.setView(arg1);
toast.show();
}}
如果这无法解决问题,请使用堆栈跟踪更新您的问题。谢谢。我想你的意思是((视图组)arg1.getParent())。removeView(arg1)无论如何都不起作用。嗯..是的,可能是因为你的视图由适配器管理。。。所以你需要告诉你的适配器数据集已经改变了…但是我认为这样重用视图并不是一个好主意。您应该使用相同的模板创建一个新模板谢谢。我想你的意思是((视图组)arg1.getParent())。removeView(arg1)无论如何都不起作用。嗯..是的,可能是因为你的视图由适配器管理。。。所以你需要告诉你的适配器数据集已经改变了…但是我认为这样重用视图并不是一个好主意。您应该使用相同的模板创建一个新模板谢谢。你的建议很明智,但不幸的是不起作用。谢谢。你的建议很明智,但不幸地是行不通。
public class MainActivity implements AdapterView.OnItemClickListener {
//start onCreate
gal.setOnItemClickListener(this);
//end onCreate
@Override
public void onItemClick(AdapterView arg0, View arg1, int arg2, long arg3) {
Toast toast = new Toast(this);
toast.setView(arg1);
toast.show();
}}