【发布时间】:2019-10-07 10:27:28
【问题描述】:
当我回到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"); // new NotificationFragment() should be in getItem()
viewPagerAdapter.addFragment(new UsersFragment(), "Users"); // new UsersFragment() should be in getItem()
viewPagerAdapter.addFragment(new SearchFragment(), "Search"); // new SearchFragment() should be in getItem()
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; // this line can cause crashes
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); // this line can cause crashes
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)
【问题讨论】:
-
fragment分离时需要删除
ValueEventListener,可能在onDestroyView()中。
标签: java android android-fragments firebase-realtime-database