要须心地收汗马,孔孟行世目杲杲。这篇文章主要讲述以有效的方式管理android片段创建?相关的知识,希望能为你提供帮助。
我有一个ViewPager
里面我有4个标签与fragments
。以前在应用程序启动时,它默认只加载了两个第一个fragments
。有道理但问题是每次我导航到第4个选项卡并返回第一个选项卡时,它必须再次创建。为了让我的fragments
只创建一次,我使用了这个方法:
mViewPager.setOffscreenPageLimit(3);
所以现在之前的问题已经消失,我可以浏览所有
fragments
,而无需再次创建它们。但是新的问题是在应用程序启动时,所有fragments
立刻被创建。因为我在每个fragment
中都有网络调用,所以会发生多个网络调用,这会导致问题(根据我的应用程序设计,这也不符合逻辑)。现在我需要找到解决问题的方法。帮助表示赞赏。编辑:
一种解决方案是使用
viewPager.addOnPageChangeListener()
并将网络呼叫放在那里,正如@Ferran所提供的那样。听起来不错!但我面临另一个问题。当在fragment
中选择了onPageSelected(int position)
时,它的所有视图字段都是null,尽管我已经在onCreateView()
方法中定义了它们(因为所有的fragments
都是在app启动时创建的,这些视图字段不应该为null)并且我无法处理网络调用结果并在视图中设置数据。我通过以下代码获得fragments
:Fragment fragment = adapter.getItem(position);
请注意,
fragment
对象本身不为null。这是我使用的典型片段:
公共类TabFragmentPayment extends Fragment实现View.OnClickListener {
private LinearLayout llError, llLoading, llNoItem;
private LinearLayout llPaymentRecords, llImageUpload;
private Button btnTryAgain;
//here it just works for transaction get.
private RecyclerView rcv;
private ImageView ivPic, ivNationalCardPreview, ivSelect, ivAddAccount;
private TextView tvUploadPic, tvRequestPayment, tvNationalCardMessage;
private Spinner spBankAccounts;
private View view;
private ArrayList<
Transaction>
paymentRecordList = new ArrayList<
>
();
private ArrayList<
Bank>
bankList = new ArrayList<
>
();
private long minToPay = -1;
public static boolean checkAccounts = false;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment_payment, null);
setWidgetReferences();
setClickListeners();
setupActivity();
return view;
}private void setWidgetReferences() {
ivPic = view.findViewById(R.id.ivfpPic);
ivSelect = view.findViewById(R.id.ivfpSelect);
ivAddAccount = view.findViewById(R.id.ivfpAddAccount);
tvUploadPic = view.findViewById(R.id.tvfpUpload);
tvRequestPayment = view.findViewById(R.id.tvfpRequestPayment);
spBankAccounts = view.findViewById(R.id.spfpSelectAccount);
llError = view.findViewById(R.id.llError);
llLoading = view.findViewById(R.id.llLoading);
llNoItem = view.findViewById(R.id.llNoItem);
btnTryAgain = view.findViewById(R.id.btnReload);
rcv = view.findViewById(R.id.rcvfpTransactions);
ivNationalCardPreview = view.findViewById(R.id.ivfpNationalCardPreview);
tvNationalCardMessage = view.findViewById(R.id.tvfpNationalCardMessage);
llPaymentRecords = view.findViewById(R.id.llfpPayment);
llImageUpload = view.findViewById(R.id.llfpImageUpload);
}private void setClickListeners() {
ivSelect.setOnClickListener(this);
ivPic.setOnClickListener(this);
ivAddAccount.setOnClickListener(this);
tvUploadPic.setOnClickListener(this);
tvRequestPayment.setOnClickListener(this);
btnTryAgain.setOnClickListener(this);
}
}
这是我如何尝试在父
Activity
中获取片段:@Override
public void onPageSelected(int position) {
Fragment fragment = adapter.getItem(position);
if (fragment instanceof TabFragmentPayment) {
TabFragmentPayment fr = (TabFragmentPayment) fragment;
}
}
并且名为fr的结果片段具有空视图字段,这对我来说很奇怪。
答案冷杉。
setOffscreenPageLimit(4)
告诉适配器创建第一个页面时再创建4个页面。因此,您可以浏览5页而无需重新加载。在你的情况下,我认为没有必要使用它。为了确保在每次创建时都没有调用您的网络调用,您可以这样做
将您的网络呼叫放在每个片段的单独方法中并公开。
然后使用它
viewPager.setAdapter(adapter);
viewPager.setOffscreenPageLimit(4);
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int i, float v, int i1) {
}@Override
public void onPageSelected(int i) {
// here you can call tour public fragment method
// i = page index
Fragment page = getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.viewpager + ":" + viewPager.getCurrentItem());
// replace R.id.viewpager with your viewpager id
// then call your public method
((YourFragmentClass)page).your_public_method();
}@Override
public void onPageScrollStateChanged(int i) {}
});
【以有效的方式管理android片段创建()】第一次,
onPageSelected
没有被解雇,因为页面没有被选中但只创建了,但onPageScrolled
确实如此。所以,玩这两种方法来调用你的片段方法。推荐阅读
- XmlPullParser - 意外令牌(android)
- 当我正在尝试为我正在通过Unity开发的游戏构建apk文件时,Android SDK未正确安装错误()
- 如何从Android-x86中的命令行启动GUI
- 访问设备/模拟器文件系统在Android Studio中
- 如何在Android应用程序中添加垂直滚动条( [关闭])
- 在android中是否有任何方法可以获得设备虚拟键盘的高度
- 使用Gitlab CI生成Android构建
- 在android模拟器中禁用menubutton
- Android Studio 3.2“找不到目标设备”