【问题标题】:NullPointerException on startAnimation(anim)开始动画(动画)上的 NullPointerException
【发布时间】:2014-10-07 19:14:39
【问题描述】:

我在 blah.startAnimation(anim) 上收到 NullPointerException,它位于 LongClickListener 内。我要做的是在 DragListener 上获取 GridLayout 中的子项数量,并在您开始拖动 imageview 时为所有子项设置动画。由于某种原因,这会返回 NullPointerException,

它的来源是:

@Override
public boolean onLongClick(View v) {
     View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(v);
     v.startDrag(null, shadowBuilder, v, 0);

     deleteAreaForAdapter.setVisibility(View.VISIBLE);
     deleteAreaForAdapter.startAnimation(slide_in);
     for(int i=0; i<middleViewForAdapter.getChildCount(); i++) {
         int middleChildCount = middleViewForAdapter.getChildCount();
         int middleChildCount1 = middleViewForAdapter.getChildCount();
         int topChildCount = middleViewForAdapter.getChildCount();
         int topChildCount1 = middleViewForAdapter.getChildCount();
         int bottomChildCount = middleViewForAdapter.getChildCount();

         LinearLayout topChild = (LinearLayout)topViewForAdapter.getChildAt(i);
         LinearLayout topChild1 = (LinearLayout)topViewForAdapter1.getChildAt(i);
         LinearLayout bottomChild = (LinearLayout)bottomViewForAdapter.getChildAt(i);

         Context context = mContext;

         Animation shakeAnim = AnimationUtils.loadAnimation(context, R.anim.shake);

         // do stuff with child view
         //ll.clearAnimation();
         /*middleChild1.startAnimation(shakeAnim);
         topChild.startAnimation(shakeAnim);
         topChild1.startAnimation(shakeAnim);
         bottomChild.startAnimation(shakeAnim);*/

         if(middleChildCount > 0)
         {
             GridLayout hjk = middleViewForAdapter;
             LinearLayout middleChild = (LinearLayout)hjk.getChildAt(i);
             middleChild.startAnimation(shakeAnim);
             ll.clearAnimation();
         }

         if(middleChildCount1 > 0)
         {
             GridLayout hjs = middleLayoutForAdapter1;
             LinearLayout middleChild1 = (LinearLayout)hjs.getChildAt(i);

             middleChild1.startAnimation(shakeAnim); //Line it's coming from!
             ll.clearAnimation();
         }

         if(topChildCount > 0)
         {
             topChild.startAnimation(shakeAnim);
             ll.clearAnimation();
         }

         if(topChildCount1 > 0)
         {
             topChild1.startAnimation(shakeAnim);
             ll.clearAnimation();
         }
      }

      v.setVisibility(View.INVISIBLE);
      return true;
  }
});

LogCat:

08-14 07:47:18.281    2078-2078/com.matt.cards.app E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.matt.cards.app, PID: 2078
    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.LinearLayout.startAnimation(android.view.animation.Animation)' on a null object reference
            at com.matt.cards.app.DrawerLongClickListener$1.onLongClick(DrawerLongClickListener.java:169)
            at android.view.View.performLongClick(View.java:4474)
            at android.view.View$CheckForLongPress.run(View.java:18401)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5017)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)

谢谢!

编辑:谁能帮忙!?!?!?

【问题讨论】:

  • 我认为您需要检查来自 MainActivity 的上下文。

标签: java android nullpointerexception


【解决方案1】:

你只需要使用

Animation shakeAnim = AnimationUtils.loadAnimation(v.getContext(), R.anim.shake);

代替

 Animation shakeAnim = AnimationUtils.loadAnimation(context, R.anim.shake);

【讨论】:

  • @Groot,如果代码在片段中,请尝试getActivity() 而不是context
  • 好的@Trust,我会试试的。
【解决方案2】:

答案很简单,我只需要创建一个

的实例

for(int i=0; i&lt;middleViewForAdapter.getChildCount(); i++) 用于我希望它处理的每个 RelativeLayout(我使用的是 RelativeLayout.getChildAt(i); 用于我拥有的每个 relativeLayout)。

【讨论】:

  • 我有同样的问题,但我无法理解你的答案。你能解释更多吗?
最近更新 更多