我是想通过一个Alpha动画的淡出效果,让一个ImageView控件消失。
然后监听这个动画,在动画结束的时候,彻底将ImageView这个控件删除。
可是只要调用了这句viewGroup.removeView(imageView),就出现空指针异,注释掉它就可以正常运行.
并且我通过调用viewGroup的indexOfChild方法,测试了一下viewGroup中的确包含imageView这个控件。
代码如下:
package mars.Animation_13;import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.widget.Button;
import android.widget.ImageView;public class MainActivity extends Activity {
    /** Called when the activity is first created. */
private ViewGroup viewGroup=null;
    private Button bu_del=null;
    private Button bu_add=null;
    private ImageView imageView=null;
@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //获取相应的控件对象
        viewGroup=(ViewGroup)findViewById(R.id.layout);
        bu_del=(Button)findViewById(R.id.bu_del);
        bu_add=(Button)findViewById(R.id.bu_add); 
        imageView=(ImageView)findViewById(R.id.imageView);
        //给按钮加上监听器
        bu_del.setOnClickListener(new delButtonListener());
    }
/**
 * 删除按钮监听器
 * @author Luckiee
 *
 */
class delButtonListener implements OnClickListener{
public void onClick(View v){
//创建一个AlphaAnimation动画效果
AlphaAnimation alpha=new AlphaAnimation(1.0f,0.0f);
alpha.setDuration(2000);
//给动画设置监听器
alpha.setAnimationListener(new delAnimationListener());
//启动动画效果
imageView.startAnimation(alpha);
}
}
/**
 * 删除动画监听器
 * @author Luckiee
 *
 */
class delAnimationListener implements Animation.AnimationListener{ @Override
public void onAnimationEnd(Animation animation) {
// TODO Auto-generated method stub
//当动画结束的时候,移除ImageView控件
viewGroup.removeView(imageView);
System.out.println("onAnimationEnd..........");
} @Override
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
System.out.println("onAnimationRepeat.........");
} @Override
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub
System.out.println("onAnimationStart........");
}

}
}大家帮忙看看什么情况,谢谢

解决方案 »

  1.   

    //当动画结束的时候,移除ImageView控件
    viewGroup.removeView(imageView);在这句话之前把viewGroup和imageView都打出来看看是否有一个为空。
    另外如果viewGroup中只有一个imageView的话,
    那就使用viewGroup.removeAllView();直接清了。
      

  2.   

    我试过的,都不为空。并且程序的所有环节都能正常输出。还有,viewGroup里面肯定不止一个View:一个TextView,一个ImageView,两个Button。
      

  3.   

    总感觉这是因为在监听器中调用viewGroup.removeView(imageView);
    后imageView对象被清空了,然而这个Animation是由imageView启动的,所以它会报异常。
    但好像又说不过去,因为我这个调用是在onAnimationEnd中的。
    按理说不会啊,我测试了程序的每一行,都可以正常输出测试信息。
      

  4.   

    既然是空指针,应该能看到错误的地方吧,debug跟!
      

  5.   


    //修改onAnimationEnd事件延时通知viewGroup
    public void onAnimationEnd(Animation animation) {
    System.out.println("onAnimationEnd..........");
    new Thread(new Runnable() {

    @Override
    public void run() {
    try {
    Thread.sleep(500);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    handler.sendEmptyMessage(0);
    }
    }).start();
    }

    private Handler handler=new Handler(){
    public void dispatchMessage(android.os.Message msg) {
    switch (msg.what) {
    case 0:
    //当动画结束的时候,移除ImageView控件
    viewGroup.removeView(imageView);
    break; default:
    break;
    }
    };
    };
      

  6.   

    1. 把异常贴出来看看呢?
    2. 为什么一定要把imageView给删掉呢? imageView.setVisible(View.GONE); 不可以吗?
      

  7.   

    动画结束的时候先调用imageview.clearAnimation();//清除掉动画
    在删掉这个imageview
      

  8.   

    谢谢啦,是的,主要是线程的原因。
    要等Animation结束一段时间之后才能执行这个删除操作,灰常感谢。
      

  9.   

    还有其他的解决方法: delButtonListener 方法中设置一下就OK了 
    anim.setFillAfter(true);
    anim.setFillBefore(false);