2015-03-03 49 views
1

我必须为我的Android Wear使用Watchviewstub,这会导致我产生NullpointerException。当我不使用WatchviewStub时,AnimationDrawable工作正常。尝试使用WatchViewStub启动AnimationDrawable时产生NullPointerException

基本上我试图解决它,就像它被描述为here。在阅读post时,我也无法得到答案。

main_layout.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.wearable.view.WatchViewStub 

    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/too/white" 
    android:padding="1dp" 

    android:id="@+id/watch_view_stub" 

    android:layout_width="match_parent" 
    android:layout_height="match_parent" 

    app:rectLayout="@layout/rect_activity_main" 
    app:roundLayout="@layout/round_activity_main" 

    tools:context=".MainActivity" 
    tools:deviceIds="wear"> 

    </android.support.wearable.view.WatchViewStub> 

rect_activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:keepScreenOn="true" 
    android:background="@color/white" 
    app:layout_box="all" 
    xmlns:app="http://schemas.android.com/tools" 
    xmlns:android="http://schemas.android.com/apk/res/android"> 

    <ImageView 
     android:layout_width="40dp" 
     android:layout_height="40dp" 
     android:layout_marginTop="6dp" 
     android:layout_marginRight="2dp" 
     android:id="@+id/heart_animation" 
     android:layout_gravity="right|top" 
     android:src="@drawable/heart_animation"/> 

    <TextView 
     android:id="@+id/rate" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textSize="15sp" 
     android:text="89" 
     android:textColor="@color/white" 
     android:layout_marginTop="10dp" 
     android:layout_marginRight="13dp" 
     android:layout_gravity="right|top"/> 

</FrameLayout> 

抽拉/ heart_animation.xml

<?xml version="1.0" encoding="utf-8"?> 
<animation-list 
    android:id="@+id/heart_animation_drawable" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:oneshot="false"> 
    <item android:drawable="@drawable/heart_grey" android:duration="500" /> 
    <item android:drawable="@drawable/heart_red" android:duration="900" /> 
    <item android:drawable="@drawable/heart_grey" android:duration="200" /> 
    <item android:drawable="@drawable/heart_red" android:duration="350" /> 
    <item android:drawable="@drawable/heart_grey" android:duration="200" /> 
    <item android:drawable="@drawable/heart_red" android:duration="350" /> 
</animation-list> 

MainActivity.java

ImageView view; 
    AnimationDrawable frameAnimation; 

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     view = (ImageView) findViewById(R.id.heart_animation); 
     view.setBackgroundResource(R.drawable.heart_animation); 
     frameAnimation = (AnimationDrawable) view.getBackground(); 
} 

    // Called when Activity becomes visible or invisible to the user 
    @Override 
    public void onWindowFocusChanged(boolean hasFocus) { 
     super.onWindowFocusChanged(hasFocus); 
     if (hasFocus) { 
      // Starting the animation when in Focus 
      frameAnimation.start(); 
     } else { 
      // Stoping the animation when not in Focus 
      frameAnimation.stop(); 
     } 
    } 

错误:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setBackgroundResource(int)' on a null object reference 
     at de.denjo.test.MainActivity.onCreate(MainActivity.java:72) 

回答

1

如果使用WatchViewStub,你不能直接得到你需要的布局的内容,但你必须获取WatchViewStub对象,并在其上调用setOnLayoutInflatedListener。当调用回调函数时,可以使用WatchViewStub对象查找所需的对象。例如

final WatchViewStub stub = (WatchViewStub) findViewById(R.id.watch_view_stub); 
stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() { 
    @Override 
    public void onLayoutInflated(WatchViewStub watchViewStub) { 
      view = (ImageView) watchViewStub.findViewById(R.id.heart_animation); 
      view.setBackgroundResource(R.drawable.heart_animation); 
      frameAnimation = (AnimationDrawable) view.getBackground(); 
    } 
}); 
+0

是的,我没有这种方式得到NullPointerException。但是,动画还没有开始。 :( – 2015-03-03 14:41:55

+0

尝试调用'frameAnimation.start();''刚刚在'frameAnimation =(AnimationDrawable)view.getBackground();' – Blackbelt 2015-03-03 14:44:52

+0

不会这样工作...... – 2015-03-03 16:03:38

相关问题