Reputation: 2046
Here is my code for Tab Initialization:
private void initTabs() {
serviceTabs.addTab(serviceTabs.newTab().setText("Request Appointment"));
serviceTabs.addTab(serviceTabs.newTab().setText("Online Booking"));
serviceTabs.addTab(serviceTabs.newTab().setText("Feedback"));
serviceViewpager.setOffscreenPageLimit(serviceTabs.getTabCount());
final ViewPageAdapter adapter = new ViewPageAdapter(getChildFragmentManager(), serviceTabs.getTabCount(),
mContext);
serviceViewpager.setAdapter(adapter);
serviceViewpager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(serviceTabs));
serviceTabs.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
serviceViewpager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
Log.i("", "on tab unselected Service");
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
Log.i("", "on tab reselected Service ");
}
});
}
private class ViewPageAdapter extends FragmentStatePagerAdapter {
int mNumOfTabs;
Context context;
ViewPageAdapter(FragmentManager fm, int numOfTabs, Context context) {
super(fm);
this.mNumOfTabs = numOfTabs;
this.context = context;
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return new CustomizeFragment();
case 1:
Bundle url = new Bundle(); url.putString(Constants.WEB_URL,Constants.APPOINTMENT_ONLINE_BOOKING);
return WebViewFragment.createInstance(url);
case 2:
return new CustomizeFragment();
default:
return null;
}
}
@Override
public int getCount() {
return mNumOfTabs;
}
}
@Override
public void onDestroyView() {
super.onDestroyView();
unbinder.unbind();
}
And I'm having the progress bar loading inside the WebViewFragment as Follows:
public static WebViewFragment createInstance(Bundle urlArgs) {
WebViewFragment webView = new WebViewFragment();
webView.setArguments(urlArgs);
return webView;
}
@Override
public View onCreateView(LayoutInflater layoutInflater, ViewGroup container, Bundle saveInstanceState) {
rootView = layoutInflater.inflate(R.layout.load_web_view, container, false);
activity = getActivity();
url=getArguments().getString(Constants.WEB_URL);
mContext = activity.getApplicationContext();
serviceAppointmentView = (WebView) rootView.findViewById(R.id.webView);
loadData();
return rootView;
}
public void loadData()
{
serviceAppointmentView.clearView();
webSettings = serviceAppointmentView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setSupportZoom(true);
webSettings.setBuiltInZoomControls(true);
webSettings.setLoadWithOverviewMode(true);
webSettings.setUseWideViewPort(true);
progress = new Progress(activity);
pDialog = progress.showProgress();
pDialog.setCanceledOnTouchOutside(true);
serviceAppointmentView.loadUrl(url);
serviceAppointmentView.setWebViewClient(new
DealerWebViewClient());
}
private class DealerWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
{
view.loadUrl(url);
return true;
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
progress.dismissProgress(pDialog);
}
}
Im Using the custom progress bar for Online Booking Tab. The problem here is the Progress begins to load before I tap the Online Booking tab. Please tell me where i'm doing the mistake or how could be this solved...Thanks for patiently looking on my code and any suggestions will be helpful for me...!
Upvotes: 1
Views: 1449
Reputation: 409
By default Viewpager can load the three pages at a time.one is the current page and remaining are left and right side of the current page.So if you open your activity opposite sides of your fragments will also intializes.so overrride this method in your fragment below your onCreate()
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
loaddata();
}else{
}
}
This will call whenever your fragment is visible to user
Upvotes: 1
Reputation: 2427
I hope it will help you.
As viewpager loads adjacent fragments of current fragment , Its better to use progressbar in xml like this following while working with the viewpager inseted of progressdialog or something :
<ProgressBar
android:id="@+id/progressbar"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|center_horizontal"
android:visibility="visible" />
Upvotes: 1
Reputation: 2937
ViewPage has DEFAULT_OFFSCREEN_PAGES value which is 1, and it is the min value, you can not set it to 0.
It means that when you are initing the viewpager and the fragments are added, when it does init fragment at postion 0 it does also init fragment at position 1.
There is a method, inside Fragment.class
setUserVisibleHint(boolean)
which is called when the fragment is visible to user(getting selected in viewPager).
You can ovveride it to achieve your loading progress start whenever you need. Keep inmind that it is also fired before
onCreateView()
You can check if view is already inflated checking if any view is not null.
Upvotes: 3
Reputation: 1033
View pager will by default load atleast 1 on the right and one on the left tab of current tab. It is done so, mostly because there is a point when u slide viewpager, when certain area of both tabs is visible. For those smooth transitions preloading is required.
To prevent this you can use this method setUserVisibleHint()
.
Like below code:
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
// load data here
}else{
}
}
Upvotes: 1