@AndreyRafalsky13

Запуск анимации фрагмента только тогда, когда фрагмент видимый (PagerView). Почему получаю NullPointerException?

Добрый день. Подскажите пожалуйста, как решить проблему. Есть фрагмент, для которого нужно начать анимацию, когда он становится видимым. Перелистывание элементов реализовано с помощью PagerView. Соответственно, создается не только фрагмент, который видимый на данных момент, но и соседние с ним. И если для видимого фрагмента запускается анимация, то и для соседних она начинается тоже. Поэтому, когда перелистываю на следующий фрагмент, анимация на нем уже закончилась.

Во фрагменте все реализовано следующий образом.
В методе onViewCreated() вызываю 3 метода:
1) init() (инициализация)

private void init(View view) {
            detailImage = view.findViewById(R.id.detail_image);
            detailCreator = view.findViewById(R.id.creator_detail);
            detailLikes = view.findViewById(R.id.likes_detail);
            detailDownloads = view.findViewById(R.id.downloads_detail);
            detailFavorites = view.findViewById(R.id.favourites_detail);
    
            layout = view.findViewById(R.id.root_detail_layout);
            animationDrawable = (AnimationDrawable) layout.getBackground();
    
            animationDrawable.setEnterFadeDuration(5000);
            animationDrawable.setExitFadeDuration(2000);
        }

2) setData() (заполнение данными)

private void setData() {
        PhotoItem item = (PhotoItem) getArguments().getSerializable(ITEM_ARG);
        Picasso.get().load(item.getImageUrl()).fit().centerInside().into(detailImage);
        detailCreator.setText(item.getCreatorName());
        detailLikes.setText(String.format(getString(R.string.likes_info), item.getLikes()));
        detailDownloads.setText(String.format(getString(R.string.downloads_info), item.getDownloads()));
        detailFavorites.setText(String.format(getString(R.string.favorites_info), item.getFavorites()));
    }


3) startAnimations()

public void startAnimations(float translationY, int duration) {
            detailImage.animate().translationY(translationY).setDuration(duration).start();
            detailCreator.animate().translationY(translationY).setDuration(duration).setStartDelay(duration).start();
            detailLikes.animate().translationY(translationY).setDuration(duration).setStartDelay(2*duration).start();
            detailDownloads.animate().translationY(translationY).setDuration(duration).setStartDelay(3*duration).start();
            detailFavorites.animate().translationY(translationY).setDuration(duration).setStartDelay(4*duration).start();
    }


Пытаюсь реализовать запуск анимации только для одного фрагмента с помощью ViewPager.OnPageChangeListener:

@Override
    public void onPageSelected(int i) {
        PhotoDetailFragment fragment = 
    (PhotoDetailFragment)adapter.instantiateItem(pager, i);
        fragment.startAnimations(50f, 1000);
    }


Получаю NullPointerException, причем не каждый раз, что очень странно

> E/AndroidRuntime: FATAL EXCEPTION: main
> Process: com.rafalsky.lesson1, PID: 14944
> java.lang.RuntimeException: Unable to start activity ComponentInfo{com.rafalsky.lesson1/com.rafalsky.lesson1.view.activity.PhotoDetailActivity}:
> java.lang.NullPointerException: Attempt to invoke virtual method
> 'android.view.ViewPropertyAnimator android.widget.ImageView.animate()'
> on a null object reference
> at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913)
> at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
> at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
> at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
> at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
> at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
> at android.os.Handler.dispatchMessage(Handler.java:106)
> at android.os.Looper.loop(Looper.java:193)
> at android.app.ActivityThread.main(ActivityThread.java:6669)
> at java.lang.reflect.Method.invoke(Native Method)
> at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
> at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
> Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.ViewPropertyAnimator
> android.widget.ImageView.animate()' on a null object reference
> at com.rafalsky.lesson1.view.fragment.PhotoDetailFragment.startAnimations(PhotoDetailFragment.java:50)
> at com.rafalsky.lesson1.view.activity.PhotoDetailActivity$2.onPageSelected(PhotoDetailActivity.java:70)
> at android.support.v4.view.ViewPager.dispatchOnPageSelected(ViewPager.java:1947)
> at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:665)
> at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:631)
> at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:612)
> at com.rafalsky.lesson1.view.activity.PhotoDetailActivity.init(PhotoDetailActivity.java:79)
> at com.rafalsky.lesson1.view.activity.PhotoDetailActivity.onCreate(PhotoDetailActivity.java:33)
> at android.app.Activity.performCreate(Activity.java:7136)
> at android.app.Activity.performCreate(Activity.java:7127)
> at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
> at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)
> at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
> at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
> at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
> at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
> at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
> at android.os.Handler.dispatchMessage(Handler.java:106)
> at android.os.Looper.loop(Looper.java:193)
> at android.app.ActivityThread.main(ActivityThread.java:6669)
> at java.lang.reflect.Method.invoke(Native Method)
> at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
> at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)


Почему так происходит, ведь я вызываю метод init() в методе onViewCreated(). Прошелся дебагером, в imageView лежит ссылка, не null. Подскажите, как решить проблему. Заранее благодарен за помощь.
  • Вопрос задан
  • 67 просмотров
Пригласить эксперта
Ответы на вопрос 1
MAGISTR_BRU
@MAGISTR_BRU
Я только учусь
Добрый день,

Ошибка NullPointerException происходит из-за того, что функция startAnimations() вызывается до того, как View создается.

Момента, когда фрагмент становится видимым пользователю внутри PagerView, можно определить с помощью переопределения функции setUserVisibleHint() внутри фрагмента. Более подробную информацию можно найти по ссылке https://stackoverflow.com/questions/10024739/how-t...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы