Как реализовать автоматический слайдер изображений внутри фрагмента - PullRequest
1 голос
/ 04 марта 2020

Я использую следующую библиотеку в своем проекте для автоматического скольжения изображений. Он хорошо работает внутри Activity, но когда дело доходит до Fragment, он выдает исключение нулевого указателя, когда контекст передается как getContext(); или getActivity(); вместо this;. Я застрял с этим сейчас. Пожалуйста, помогите.

Имя библиотеки: Ссылка на библиотеку

Мой код внутри фрагмента:

SliderView sliderView = view.findViewById(R.id.ImageSlider);

SliderImageAdapter adapter = new SliderImageAdapter(getContext());
adapter.setCount(5);

sliderView.setSliderAdapter(adapter);

sliderView.setIndicatorAnimation(IndicatorAnimations.SLIDE); //set indicator animation by using SliderLayout.IndicatorAnimations. :WORM or THIN_WORM or COLOR or DROP or FILL or NONE or SCALE or SCALE_DOWN or SLIDE and SWAP!!
sliderView.setSliderTransformAnimation(SliderAnimations.CUBEINROTATIONTRANSFORMATION);
sliderView.setAutoCycleDirection(SliderView.AUTO_CYCLE_DIRECTION_BACK_AND_FORTH);
sliderView.setIndicatorSelectedColor(Color.WHITE);
sliderView.setIndicatorUnselectedColor(Color.GRAY);
sliderView.startAutoCycle();

Мой Logcat:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.coderedinnovations.allioservices, PID: 7955
java.lang.NullPointerException: Attempt to invoke virtual method 'void com.smarteist.autoimageslider.SliderView.setSliderAdapter(com.smarteist.autoimageslider.SliderViewAdapter)' on a null object reference
    at com.coderedinnovations.allioservices.AllioMain.HomeFragment.onCreateView(HomeFragment.java:53)
    at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2698)
    at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:320)
    at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1187)
    at androidx.fragment.app.FragmentManager.addAddedFragments(FragmentManager.java:2224)
    at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1997)
    at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1953)
    at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1849)
    at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2629)
    at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2577)
    at androidx.fragment.app.Fragment.performActivityCreated(Fragment.java:2722)
    at androidx.fragment.app.FragmentStateManager.activityCreated(FragmentStateManager.java:346)
    at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1188)
    at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1356)
    at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1434)
    at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1497)
    at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2625)
    at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2577)
    at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:247)
    at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:541)
    at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:201)
    at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1433)
    at android.app.Activity.performStart(Activity.java:7987)
    at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3521)
    at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:226)
    at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:206)
    at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:178)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:102)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2222)
    at android.os.Handler.dispatchMessage(Handler.java:107)
    at android.os.Looper.loop(Looper.java:228)
    at android.app.ActivityThread.main(ActivityThread.java:7772)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:981)

Код макета:

<androidx.cardview.widget.CardView
    app:cardCornerRadius="10dp"
    android:layout_margin="14dp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <com.smarteist.autoimageslider.SliderView
        android:id="@+id/imageSlider"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        app:sliderAnimationDuration="600"
        app:sliderAutoCycleDirection="back_and_forth"
        app:sliderAutoCycleEnabled="true"
        app:sliderIndicatorAnimationDuration="600"
        app:sliderIndicatorGravity="center_horizontal|bottom"
        app:sliderIndicatorMargin="15dp"
        app:sliderIndicatorOrientation="horizontal"
        app:sliderIndicatorPadding="3dp"
        app:sliderIndicatorRadius="0.5dp"
        app:sliderIndicatorSelectedColor="#5A5A5A"
        app:sliderIndicatorUnselectedColor="#FFF"
        app:sliderScrollTimeInSec="1"
        app:sliderStartAutoCycle="true" />

</androidx.cardview.widget.CardView>

Нет проблем с моим адаптером и его работой для других моих действий.

1 Ответ

0 голосов
/ 04 марта 2020

Не видя журналов ошибок logcat, трудно понять, в чем здесь проблема. Тем не менее, я подумал, что мне следует внести некоторые предложения, чтобы вы могли самостоятельно исследовать проблему.

Вы можете рассмотреть возможность инициализации вашего адаптера с Fragment следующим образом.

SliderImageAdapter adapter = new SliderImageAdapter(getActivity());

Также, пожалуйста, проверьте, имеет ли используемый вами макет атрибут ImageSlider. Если у вас нет того идентификатора макета в макете фрагмента, который вы пытаетесь раздувать, у него также должно быть исключение нулевого указателя.

Адаптер выглядит нормально ИМХО.

Обновление

Из logcat выглядит, что макет, который вы используете для Fragment, не имеет ImageSlider и, следовательно, не может быть инициализирован sliderView.

Из размещенного вами макета кажется, что идентификатор макета равен imageSlider, а не ImageSlider. Идентификаторы макета чувствительны к регистру.

Следовательно, вы должны изменить следующую строку следующим образом.

view.findViewById(R.id.imageSlider);
...