Когда я возвращаюсь к MainActivity
, где ViewPager
.Приложение вылетает, когда я пишу сообщение пользователю.Поэтому, если что-то изменится в базе данных.
Я использую Windows 10 и Android Studio
android {
compileSdkVersion 28
defaultConfig {
applicationId
minSdkVersion 26
targetSdkVersion 28
versionCode 5
versionName "1.5"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
Мой код
public class ChatNotificationFragment extends Fragment {
private FirebaseUser firebaseUser;
private DatabaseReference reference;
public ValueEventListener listener;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_chat_notification, container, false);
firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
reference = FirebaseDatabase.getInstance().getReference("Users").child(firebaseUser.getUid());
final TabLayout tabLayout = view.findViewById(R.id.tab_layout_chat);
final ViewPager viewPager = view.findViewById(R.id.view_pager_chat);
reference = FirebaseDatabase.getInstance().getReference("Chats");
listener = reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
//ChatNotificationFragment.ViewPagerAdapter viewPagerAdapter = new ChatNotificationFragment.ViewPagerAdapter(getFragmentManager());
ChatNotificationFragment.ViewPagerAdapter viewPagerAdapter = new ChatNotificationFragment.ViewPagerAdapter(getChildFragmentManager());
int unread = 0;
for (DataSnapshot snapshot : dataSnapshot.getChildren()){
Chat chat = snapshot.getValue(Chat.class);
if (Objects.requireNonNull(chat).getReceiver().equals(firebaseUser.getUid()) && !chat.isIsseen()){
unread++;
}
}
if (unread == 0){
viewPagerAdapter.addFragment(new ChatsFragment(), "Chats");
} else {
viewPagerAdapter.addFragment(new ChatsFragment(), "("+unread+") Chats");
}
viewPagerAdapter.addFragment(new NotificationFragment(), "Notification");
viewPagerAdapter.addFragment(new UsersFragment(), "Users");
viewPagerAdapter.addFragment(new SearchFragment(), "Search");
viewPager.setAdapter(viewPagerAdapter);
tabLayout.setupWithViewPager(viewPager);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
return view;
}
// class ViewPagerAdapter extends FragmentPagerAdapter {
class ViewPagerAdapter extends FragmentStatePagerAdapter {
private final ArrayList<Fragment> fragments;
private final ArrayList<String> titles;
ViewPagerAdapter(FragmentManager fm){
super(fm);
this.fragments = new ArrayList<>();
this.titles = new ArrayList<>();
}
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
@Override
public int getCount() {
return fragments.size();
}
void addFragment(Fragment fragment, String title){
fragments.add(fragment);
titles.add(title);
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
return titles.get(position);
}
}
@Override
public void onDetach() {
super.onDetach();
reference.removeEventListener(listener);
}
}
Ошибка
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.bbinkconnect.bbinktattoo, PID: 22847
java.lang.IllegalStateException: Fragment has not been attached yet.
at androidx.fragment.app.Fragment.instantiateChildFragmentManager(Fragment.java:2383)
at androidx.fragment.app.Fragment.getChildFragmentManager(Fragment.java:845)
at com.bbinkconnect.bbinktattoo.fragments.ChatNotificationFragment$1.onDataChange(ChatNotificationFragment.java:53)
at com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-database@@17.0.0:75)
at com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database@@17.0.0:63)
at com.google.firebase.database.core.view.EventRaiser$1.run(com.google.firebase:firebase-database@@17.0.0:55)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:6981)
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:1445)