Вызов ViewPager внутри фрагмента

Я разрабатываю экран Onboarding с помощью ViewPager. ViewPager находится внутри фрагмента, лежащего в основе моего класса MainActivity. Ошибка возникает, когда я передаю класс адаптера ViewPager в ViewPager внутри моего фрагмента! Он генерирует исключение NullPointerException, и после отладки точки останова я обнаруживаю, что инфлятор внутри моего класса PagerAdapter равен нулю. Я пробовал несколько альтернатив, чтобы заставить работать инфлятор, но не повезло! Я опубликую свои коды ниже:

Класс фрагмента ViewPager:

public class ViewPagerFragment extends Fragment {

ViewPager viewpager;
LinearLayout dotsLayout;
SliderAdapter sliderAdapter;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_view_pager, container, false);

    viewpager = (ViewPager) view.findViewById(R.id.viewPagerFragment);
    dotsLayout = (LinearLayout) view.findViewById(R.id.dotsLayout);

    sliderAdapter = new SliderAdapter(view.getContext());
   
    viewpager.setAdapter(sliderAdapter); //The error is thrown here
    

    // Inflate the layout for this fragment
    return view;

}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    //Toast.makeText(view.getContext(),"Here",Toast.LENGTH_LONG).show();


}}

Класс адаптера ViewPager:

public class SliderAdapter extends PagerAdapter {

Context context1;
LayoutInflater inflater;

public int[] slide_images = {
        R.drawable.band,
        R.drawable.studio,
        R.drawable.videoshoot
};
public String[] slide_headings = {
        "REHEARSAL PAD", "RECORDING STUDIO", "SESSION VIDEOSHOOT"
};
public String[] slide_desc  = {
        String.valueOf(R.string.rehearsal_desc),
        String.valueOf(R.string.studio_desc),
        String.valueOf(R.string.videoshoot_desc)
};

public  SliderAdapter(Context context){

    context1 = context;
}

@Override
public int getCount() {
    return slide_headings.length;
}

@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
    return view== (ConstraintLayout)object;
}

@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {

    //ViewPager Sliding Images and Desc
      inflater = (LayoutInflater)context1.getSystemService(context1.LAYOUT_INFLATER_SERVICE);
    //inflater = LayoutInflater.from(context1);

    View view = inflater.inflate(R.layout.slider_layout,container,false);

    ImageView slideImageView = (ImageView) view.findViewById(R.id.SliderImageView);
    TextView slideHeading = (TextView) view.findViewById(R.id.SliderTextView1);
    TextView slideDesc = (TextView) view.findViewById(R.id.SliderTextView2);

    slideImageView.setImageResource(slide_images[position]);
    slideHeading.setText(slide_headings[position]);
    slideDesc.setText(slide_desc[position]);

    container.addView(view);

    return view;
}

@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {

    container.removeView((ConstraintLayout)object);
}}

Журналы исключений приведены ниже:

E/AndroidRuntime: НЕИСПРАВНОЕ ИСКЛЮЧЕНИЕ: основной Процесс: com.example.soundflixstudios, PID: 13363 java.lang.NullPointerException: попытка вызвать виртуальный метод «void androidx.viewpager.widget.ViewPager.setAdapter (androidx.viewpager.widget.PagerAdapter)» для нулевой ссылки на объект на com.example.soundflixstudios.onboarding.ViewPagerFragment.onCreateView(ViewPagerFragment.java:43) в androidx.fragment.app.Fragment.performCreateView(Fragment.java:2698) в androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:320) в androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1187) в androidx.fragment.app.FragmentManager.addAddedFragments(FragmentManager.java:2224) в androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1997) в androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1953) в androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1849) в androidx.fragment.app.FragmentManager$4.run(FragmentManager.java:413) в android.os.Handler.handleCallback(Handler.java:873) в android.os.Handler.dispatchMessage(Handler.java:99) на android.os.Looper.loop(Looper.java:224) в android.app.ActivityThread.main(ActivityThread.java:7099) в java.lang.reflect.Method.invoke (собственный метод) в com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:536) на com.android.internal.os.ZygoteInit.main(ZygoteInit.java:876)

Любая помощь приветствуется, и да, я просмотрел несколько сообщений в stackoverflow, но не нашел никакого решения, поэтому задал новый вопрос! Заранее спасибо!

Обновлено: я добавил xml для макета «view_pager_fragment».

enter code here<?xml version = "1.0" encoding = "utf-8"?>
<LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
xmlns:app = "http://schemas.android.com/apk/res-auto"
xmlns:tools = "http://schemas.android.com/tools"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:background = "@color/white"
android:orientation = "vertical"
tools:context = ".onboarding.ViewPagerFragment">

<androidx.viewpager2.widget.ViewPager2
    android:id = "@+id/sliderViewPager"
    android:layout_width = "match_parent"
    android:layout_height = "match_parent"
    android:layout_gravity = "center"
    android:layout_weight = "1">

</androidx.viewpager2.widget.ViewPager2>

<LinearLayout
    android:id = "@+id/dotsLayout"
    android:layout_width = "wrap_content"
    android:layout_height = "66dp"
    android:layout_gravity = "center"
    android:layout_weight = "1"
    android:orientation = "horizontal">

</LinearLayout>

Можете показать fragment_view_pager.xml файл?

Son Truong 18.12.2020 06:36

@SonTruong я добавил файл xml

CodexRat 18.12.2020 13:35
0
2
116
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Можете ли вы добавить свой XML-файл (viewPagerFragment). В обычном случае nullPointerException будет отображаться, когда вы пропустите ссылки на свой xml или отсутствует тег создания xml (другой экран-пейзаж/портрет)

Да, я добавил файл xml

CodexRat 18.12.2020 13:34

как я видел, вы используете тег xml <ViewPager2> с идентификатором sliderViewPager. Не viewpagerFragement, как вы кодируете в 'viewpager = (ViewPager) view.findViewById (R.id.viewPagerFragment);' измените этот идентификатор, и вы сможете решить свою проблему

TheZero 19.12.2020 09:33

Спасибо @TheZero! Наконец-то это сработало! Я действительно совершил глупую ошибку. Большая любовь!

CodexRat 20.12.2020 09:38

Ржу не могу. Это нормально.

TheZero 20.12.2020 14:11
Ответ принят как подходящий

Первопричина

В файле view_pager_fragment.xml вы объявляете ViewPager2 с идентификатором sliderViewPager, но в классе ViewPagerFragment вы используете переменную ViewPager и назначаете ей представление с идентификатором viewPagerFragment.

Решение

Шаг 1. Измените fragment_view_pager.xml на:

<?xml version = "1.0" encoding = "utf-8"?>
<LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
    android:layout_width = "match_parent"
    android:layout_height = "match_parent"
    android:background = "@color/white"
    android:orientation = "vertical">

    <androidx.viewpager.widget.ViewPager
        android:id = "@+id/sliderViewPager"
        android:layout_width = "match_parent"
        android:layout_height = "match_parent"
        android:layout_gravity = "center"
        android:layout_weight = "1">

    </androidx.viewpager.widget.ViewPager>

    <LinearLayout
        android:id = "@+id/dotsLayout"
        android:layout_width = "wrap_content"
        android:layout_height = "66dp"
        android:layout_gravity = "center"
        android:layout_weight = "1"
        android:orientation = "horizontal">
    </LinearLayout>
</LinearLayout>

Шаг 2. В классе ViewPagerFragment измените свой код с

viewpager = (ViewPager) view.findViewById(R.id.viewPagerFragment);

к

viewpager = (ViewPager) view.findViewById(R.id.sliderViewPager);

Вау, как я сделал такую ​​тупую ошибку! Большое спасибо @son! Я уже собирался выбросить весь поток осколков, но вы меня спасли! :Д спасибо

CodexRat 20.12.2020 09:35

@CodexRat Рад помочь вам.

Son Truong 20.12.2020 09:35

Другие вопросы по теме