Как добавить календарь во фрагмент в Android Studio?

#java #android #calendar

Вопрос:

В настоящее время я пытаюсь создать приложение, для которого требуется несколько вкладок и календарь в одной из них. Я использовал фрагменты для создания нескольких вкладок, но я не нашел, как реализовать в них календарь. Я попытался просто добавить его в xml-файл с помощью палитры, но в главном я получаю нулевую ошибку.

java.lang.Исключение NullPointerException: Попытка вызвать виртуальный метод ‘void androidx.viewpager.widget.ViewPager.setAdapter(androidx.viewpager.виджет.PagerAdapter)’ по ссылке на нулевой объект

Вот мой row_calendar.xml файл

 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="Calendar layer"
       />

    <CalendarView
        android:id="@ id/calendarView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true" />


</RelativeLayout>
 

И это мое MainActivity.java

 package com.example.nootropicsmonitoringapp;

import android.os.Bundle;
import android.os.Handler;
import android.widget.CalendarView;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager.widget.ViewPager;

import com.google.android.material.tabs.TabLayout;

public class MainActivity extends AppCompatActivity {

    TabLayout tabLayout;
    ViewPager viewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tabLayout =findViewById(R.id.tabLayout);
        viewPager = findViewById(R.id.view_pager);

        getTabs();

    }

    public void getTabs(){
        final  ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());

        new Handler().post(new Runnable() {
            @Override
            public void run() {

                ViewPagerAdapter.addFragment(SubstanceListFragment.getInstance(), "Substance List");
                ViewPagerAdapter.addFragment(CalendarFragment.getInstance(), "Calendar");
                ViewPagerAdapter.addFragment(RecapFragment.getInstance(), "Recap");

                viewPager.setAdapter(viewPagerAdapter);

                tabLayout.setupWithViewPager(viewPager);
            }
        });

    }
} 

Есть идеи, что я могу изменить, чтобы исправить это ?

Спасибо за вашу помощь !

(Я довольно новичок в Android studio, и я не нашел никакого ответа в Интернете, поэтому я спрашиваю здесь)

Ответ №1:

Чтобы использовать просмотр пейджера, сначала создайте класс адаптера, подобный этому,

 public class Adapter extends FragmentStateAdapter {

public Adapter(@NonNull FragmentActivity fragmentActivity) {
    super(fragmentActivity);
}

@NonNull
@Override
public Fragment createFragment(int position) {
    return if (position == 0) {
        new FirstFragment()
    } else {                       // Use Switch Statement here.
        new SecondFragment()
    }
}

@Override
public int getItemCount() {
    return 2; // The number of tabs your Tab Layout has 
}
}
 

А затем установите этот адаптер на свой пейджер просмотра

 binding.viewPager.setAdapter(new Adapter(this)); 
 

Настройка макета вкладки с помощью пейджера просмотра,

 tabLayout.setupWithViewPager(viewPager);
 

Теперь это будет работать нормально.

Комментарии:

1. Эй, спасибо за ваш ответ, я немного проверил, и кажется, что у меня уже был адаптер, но я использовал устаревшую версию (ViewPager, а не ViewPager2). Я перенес его, но у меня все еще есть несколько проблем с настройкой адаптера : — откуда берется привязка ? — ViewPager.setAdapter требует активности фрагмента, но при вводе «это» по какой-то причине вводится запускаемый объект, к чему относится «это»?

2. Я использую привязку представления, поэтому оттуда появилась привязка, но вы можете просто использовать viewpager, потому что вы используете findViewById(). И во-вторых, вы можете использовать MainActivity.this вместо этого. Это сработает.