#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 вместо этого. Это сработает.