1

I have to use a Watchviewstub for my Android Wear and this causes me a NullpointerException. When I don`t use the WatchviewStub the AnimationDrawable is working perfect.

Basically I am trying it to solve it like it is described here. I also couldn`t get an answer while reading this 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>

drawable/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();
        }
    }

Error:

 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)
Community
  • 1
  • 1
Den Jo
  • 112
  • 1
  • 12

1 Answers1

1

If you use the WatchViewStub, you don't get directly the layout's content you expected, but you have to retrieve the WatchViewStub object, and call setOnLayoutInflatedListener on it. When the callback is invoked you can use the WatchViewStub object to look for the object you want. E.g

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(); 
     }
 });
Blackbelt
  • 156,034
  • 29
  • 297
  • 305
  • Yes, I don`t get a NullPointerException this way. But still, the animation doesn`t start. :( – Den Jo Mar 03 '15 at 14:41
  • try calling `frameAnimation.start();` just after `frameAnimation = (AnimationDrawable) view.getBackground();` – Blackbelt Mar 03 '15 at 14:44