0

I have multiple tabs in my Activity. Each tab opens a specific URL of an e-commerce website. When I add an item to the cart from 1st tab and change the tab to 2nd tab, the item added is not updated in the 2nd tab. What should I do?

In the desktop browser, if 2 tabs are opened (of same e-commerce website) and I add an item to the cart from the 1st tab then automatically in the 2nd tab the item is also added. I want to achieve the same in android tab. Please help

FragmentWebView.java

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_web_view_categories, container, false);
        progressBar = view.findViewById(R.id.progressBarWVCategories);
        webView = view.findViewById(R.id.webViewCategoriesActivity);
        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webView.setWebViewClient(new MyWebViewClient());

        webView.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                if (newProgress < 100 && progressBar.getVisibility() == ProgressBar.GONE) {
                    progressBar.setVisibility(ProgressBar.VISIBLE);
                }

                progressBar.setProgress(newProgress);
                if (newProgress == 100) {
                    progressBar.setVisibility(ProgressBar.GONE);
                    //toolbar.setTitle(webView.getTitle().trim());
                }
            }
        });

        webView.setOnKeyListener(new View.OnKeyListener() {

            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (keyCode == KeyEvent.KEYCODE_BACK
                        && event.getAction() == MotionEvent.ACTION_UP) {

                    if (webView.canGoBack())
                        handler.sendEmptyMessage(1);
                    else
                        handler.sendEmptyMessage(2);
                    return true;
                }

                return false;
            }

        });

        if (webViewBundle == null) {
            webView.loadUrl(url);
        } else {
            webView.restoreState(webViewBundle);
        }
        return view;
    }
private class MyWebViewClient 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);
            //view.loadUrl();
        }
    }

ActivityWebView.java

private Toolbar toolbar;
    private TabLayout tabLayout;
    private ViewPager viewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_web_view_categories);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        toolbar = (Toolbar) findViewById(R.id.toolbarWebViewCategories);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(WebViewCategories.this, MainActivity.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(intent);
            }
        });

        Intent intent = getIntent();
        String toolbarTitle = intent.getStringExtra("toolbarTitle");
        String[] tabsName = intent.getStringArrayExtra("tabsName");
        String[] tabsLink = intent.getStringArrayExtra("tabsLink");

        viewPager = (ViewPager) findViewById(R.id.viewpager);
        setupViewPager(viewPager, tabsName, tabsLink);

        tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);

        getSupportActionBar().setTitle(toolbarTitle);
    }

    private void setupViewPager(ViewPager viewPager, String[] tabsName, String[] tabsLink) {
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());

        for (int i = 0; i < tabsName.length; i++) {
            adapter.addFragment(new FragmentWebViewCategories(tabsLink[i]), tabsName[i]);
        }
        viewPager.setAdapter(adapter);
    }

    class ViewPagerAdapter extends FragmentPagerAdapter {
        private final List<Fragment> mFragmentList = new ArrayList<>();
        private final List<String> mFragmentTitleList = new ArrayList<>();

        public ViewPagerAdapter(FragmentManager manager) {
            super(manager);
        }

        @Override
        public Fragment getItem(int position) {
            return mFragmentList.get(position);
        }

        @Override
        public int getCount() {
            return mFragmentList.size();
        }

        public void addFragment(Fragment fragment, String title) {
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return mFragmentTitleList.get(position);
        }
    }
akkk
  • 1,457
  • 4
  • 23
  • 41

1 Answers1

0

Unfortunately, those 2 pages do not know about each other. You need to reload your WebView manually on changing tab.

  1. Add reloadWebView method to your FragmentWebView, where you call webView.reload() or webView.loadUrl(url);
  2. Save link to current fragment in your adapter, similar to https://stackoverflow.com/a/21104114/1735198
  3. Add OnPageChangeListener to your ViewPager in setupViewPager.
  4. Inside the page listener do

    @Override
    public void onPageSelected(int position) {
          super.onPageSelected(position);
    
          FragmentWebView selectedFragment =
                         viewPager.getAdapter(). getCurrentFragment();
          selectedFragment.reloadWebView();     
    }
    
TpoM6oH
  • 8,385
  • 3
  • 40
  • 72
  • It's not working. When i add the item into cart (from 1st tab) and then change & come back to the same tab, the item added to the cart from tab 1 is gone. Any other solutions? – akkk Mar 12 '18 at 18:29
  • Is it gone after you reload the page? – TpoM6oH Mar 12 '18 at 18:35
  • That's probably because the cookies are not retained. – TpoM6oH Mar 12 '18 at 18:39
  • You can try to share cookie storage between the views, like here https://stackoverflow.com/questions/12731211/pass-cookies-from-httpurlconnection-java-net-cookiemanager-to-webview-android/18070681#18070681 – TpoM6oH Mar 12 '18 at 18:52