Lottie Animation setAnimation() 结果 IllegalStateException
Lottie Animation setAnimation() results IllegalStateException
我今天想检查 iOS 和 Android 的 Lottie 库,我在 After Effect 中制作了一个简单的指示器动画并将其导出到 .json 文件并且它可以正常工作在 iOS。当我在 Android 上测试同一个文件时,出现以下错误:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.test.lottietest/com.test.lottietest.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.airbnb.lottie.LottieAnimationView.setAnimation(java.lang.String)' on a null object reference
这是我的activityXML
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.mtids.lottietest.MainActivity">
<view
class="com.airbnb.lottie.LottieAnimationView"
id="@+id/animationView"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginStart="133dp"
android:layout_marginTop="20dp"
android:onClick="animate"
android:text="animate" />
</RelativeLayout>
Activity代码
public class MainActivity extends AppCompatActivity {
LottieAnimationView anim;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
anim = (LottieAnimationView) findViewById(R.id.animationView);
anim.setAnimation("indicator.json");
}
public void animate(View view) {
anim.loop(true);
anim.playAnimation();
}
}
i'v changed the id property to android : id="@+id/animationView" instead of id="@+id/animationView" only , and the error message become java.lang.IllegalStateException: Unable to find file indicator.json
正如您正确注意到的那样,首先您应该将 id
更改为 android:id
。
其次,来自sources of setAnimation(String)
:
Sets the animation from a file in the assets directory.
显然,assets
目录中没有名为 "indicator.json" 的文件。
更新版本为:
implementation 'com.airbnb.android:lottie:3.0.3'
您必须创建一个原始资源目录,然后将“indicator.json”文件粘贴到那里。
变化:
public class MainActivity extends AppCompatActivity {
LottieAnimationView anim;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
anim = (LottieAnimationView) findViewById(R.id.animationView);
anim.setAnimation("indicator.json");
}
public void animate(View view) {
anim.loop(true);
anim.playAnimation();
}
}
收件人:
public class MainActivity extends AppCompatActivity {
LottieAnimationView anim;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
anim = (LottieAnimationView) findViewById(R.id.animationView);
anim.setAnimation(R.raw.indicator);
}
public void animate(View view) {
anim.loop(true);
anim.playAnimation();
}
}
并且在 xml 文件中:
变化:
<view
class="com.airbnb.lottie.LottieAnimationView"
id="@+id/animationView"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
收件人:
<com.airbnb.lottie.LottieAnimationView
android:id="@+id/animationView"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
这些更改对我有用。
只需添加此行即可以编程方式更改动画。
// i have used data binding
binding.animationView.setAnimation(R.raw.paymentsuccess);
我今天想检查 iOS 和 Android 的 Lottie 库,我在 After Effect 中制作了一个简单的指示器动画并将其导出到 .json 文件并且它可以正常工作在 iOS。当我在 Android 上测试同一个文件时,出现以下错误:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.test.lottietest/com.test.lottietest.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.airbnb.lottie.LottieAnimationView.setAnimation(java.lang.String)' on a null object reference
这是我的activityXML
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.mtids.lottietest.MainActivity">
<view
class="com.airbnb.lottie.LottieAnimationView"
id="@+id/animationView"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginStart="133dp"
android:layout_marginTop="20dp"
android:onClick="animate"
android:text="animate" />
</RelativeLayout>
Activity代码
public class MainActivity extends AppCompatActivity {
LottieAnimationView anim;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
anim = (LottieAnimationView) findViewById(R.id.animationView);
anim.setAnimation("indicator.json");
}
public void animate(View view) {
anim.loop(true);
anim.playAnimation();
}
}
i'v changed the id property to android : id="@+id/animationView" instead of id="@+id/animationView" only , and the error message become java.lang.IllegalStateException: Unable to find file indicator.json
正如您正确注意到的那样,首先您应该将 id
更改为 android:id
。
其次,来自sources of setAnimation(String)
:
Sets the animation from a file in the assets directory.
显然,assets
目录中没有名为 "indicator.json" 的文件。
更新版本为:
implementation 'com.airbnb.android:lottie:3.0.3'
您必须创建一个原始资源目录,然后将“indicator.json”文件粘贴到那里。
变化:
public class MainActivity extends AppCompatActivity {
LottieAnimationView anim;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
anim = (LottieAnimationView) findViewById(R.id.animationView);
anim.setAnimation("indicator.json");
}
public void animate(View view) {
anim.loop(true);
anim.playAnimation();
}
}
收件人:
public class MainActivity extends AppCompatActivity {
LottieAnimationView anim;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
anim = (LottieAnimationView) findViewById(R.id.animationView);
anim.setAnimation(R.raw.indicator);
}
public void animate(View view) {
anim.loop(true);
anim.playAnimation();
}
}
并且在 xml 文件中:
变化:
<view
class="com.airbnb.lottie.LottieAnimationView"
id="@+id/animationView"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
收件人:
<com.airbnb.lottie.LottieAnimationView
android:id="@+id/animationView"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
这些更改对我有用。
只需添加此行即可以编程方式更改动画。
// i have used data binding
binding.animationView.setAnimation(R.raw.paymentsuccess);