Android &引用;java.lang.IllegalArgumentException:视图未附加到窗口管理器";叫吐司的时候

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(

我得到以下“java.lang.IllegalArgumentException:视图未附加到窗口管理器”

调用toast.show()时会发生这种情况

请解释一下?非常感谢

编辑:我发布所有代码+日志

代码-请注意,在侦听器中调用toast.show()时会发生错误

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();

    }}