为什么我在这个项目中得到NullPointerException?

时间:2014-04-17 22:34:06

标签: android android-fragments android-animation android-tabs tween

现在这个问题已经过时了解其余部分。继承了我的工作代码:

package edu.wmich.lab4_jjohns1119;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.view.animation.AnimationUtils;
import android.view.animation.Animation;

public class MainFragment extends Fragment {

//Declare widget objects
Button btnAnimate;
ImageView imgTween;
Animation tweenAnimation;

//create view
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

//Inflater
View rootView = inflater.inflate(R.layout.fragment_main, container,false);
//Button
     btnAnimate = (Button)rootView.findViewById(R.id.btnAnimate);   
     //Image
     imgTween = (ImageView)rootView.findViewById(R.id.imgTween);
     //Animation Resource
    tweenAnimation = AnimationUtils.loadAnimation(getActivity(), R.anim.tween1);
//Button listener for animation
btnAnimate.setOnClickListener(new View.OnClickListener(){

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        //animate image
        imgTween.startAnimation(tweenAnimation);
    }

});
//Return view
return rootView;
}
}

它启动,它导航,但动画什么都不做。我的猜测是代码的顺序不正确,它在动画之前显示视图。继承我的tween1.xml:

<?xml version="1.0" encoding="utf-8"?>
<rotate
xmlns:android="http//schemas.android.com/apk/res/android"
android:fromDegrees="0"
android:toDegrees="-45"
android:duration="400"
 />

3 个答案:

答案 0 :(得分:3)

您的问题在于分配tweenAnimation字段

Animation tweenAnimation = AnimationUtils.loadAnimation(getActivity(), R.anim.tween1);

getActivity()在片段生命周期(创建)中此时为空,将导致loadAnimation失败或返回空动画。然后访问它将导致NPE(如果loadAnimation尚未抛出)

tweenAnimation分配到片段生命周期中存在活动的位置,例如onCreate

离。

Animation tweenAnimation;
@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreat(savedInstanceState);
    tweenAnimation = AnimationUtils.loadAnimation(getActivity(), R.anim.tween1);
}

答案 1 :(得分:2)

为什么使用getView()? 移动rootView下面的所有作业并执行:

btnAnimate = (Button)rootView.findViewById(R.id.btnAnimate);

要使动画生效,请将名称空间声明更改为:

http://schemas.android.com/apk/res/android

(注意样本中缺少http后的冒号)

...

答案 2 :(得分:0)

问题是您无法在活动完成之前致电getView()getActivity()。因此,您只需要通过覆盖onActivityCreated(...)方法来调用这些方法。