【问题标题】:Two Different Firebase method work in two different fragment int the same time两种不同的 Firebase 方法同时在两个不同的片段 int 中工作
【发布时间】:2020-09-08 17:56:09
【问题描述】:

我有两个片段,它们是选项卡式片段。

public class SectionsPagerAdapter extends FragmentPagerAdapter {

@StringRes
private static final int[] TAB_TITLES = new int[]{R.string.tab_text_1, R.string.tab_text_2};
private final Context mContext;

public SectionsPagerAdapter(Context context, FragmentManager fm, String company) {
    super(fm);
    mContext = context;
}

@Override
public Fragment getItem(int position) {
    Fragment fragment = null;
    switch (position){
        case 0:
            fragment = new GeneralFragment();
            break;
        case 1:
            fragment = new ContactFragment();
            break;
    }
    return fragment;
}

@Nullable
@Override
public CharSequence getPageTitle(int position) {
    return mContext.getResources().getString(TAB_TITLES[position]);
}

@Override
public int getCount() {
    return 2;
}
}

ContactFragment 是:

public class ContactFragment extends Fragment {

    @Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    reference = FirebaseDatabase.getInstance().getReference();
    return inflater.inflate(R.layout.fragment_contact, container, false);
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    getDataFromDatabase();
}

    private void getDataFromDatabase(){
    reference.child("mPath1").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            String address = dataSnapshot.child("address").getValue().toString();
            String email = dataSnapshot.child("e_mail").getValue().toString();
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });
}

}

和GeneralFragment:

public class GeneralFragment extends Fragment {

    @Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    reference = FirebaseDatabase.getInstance().getReference();
    return inflater.inflate(R.layout.fragment_contact, container, false);
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    getDataFromDatabase();
}

    private void getDataFromDatabase(){
    reference.child("mPath2").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            String username = dataSnapshot.child("username").getValue().toString();
            String phoneNum = dataSnapshot.child("phone_number").getValue().toString();
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError){
        }
    });
}

}

我想在用户看到 ContactFragment 时获取地址和电子邮件,并在用户看到 GeneralFragment UI 时获取用户名和电话号码。但是两个 firebase 方法都运行,并且在创建 Activity 时从数据库中获取所有数据。为什么会发生这种情况以及如何处理。

【问题讨论】:

  • 你能分享通用片段代码吗?
  • 当然。在这里
  • 所以你问为什么两种方法同时工作?
  • 是的,Ticherhaz,这就是我要问的

标签: java android firebase android-fragments firebase-realtime-database


【解决方案1】:

Firebase 方法同时运行,因为您的 SectionsPagerAdapter 同时加载了您的两个片段。


有没有一种方法可以使一个片段仅在需要时才加载[在此选项卡式场景中]

不,因为offScreenPageLimit 的最小值为 1,而在您的情况下,您有两个片段。


还有其他解决方案吗?

是的。
由于您的计划是仅在片段可见时执行某些任务,因此您可以像这样在片段中覆盖 setUserVisibleHint

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
        // your Firebase call here
    }
} 


我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 2016-11-12
    • 2021-10-25
    • 1970-01-01
    相关资源
    最近更新 更多