Как загрузить все фрагменты webview при запуске приложения и никогда не перезагружать при навигации пользователя?

#java #android #android-fragments #webview

#java #Android #android-фрагменты #webview

Вопрос:

Я пытаюсь загрузить все фрагменты при запуске приложения, и они никогда не будут перезагружены, даже когда пользователь переходит на разные страницы. Возможно ли это? Ниже приведен мой MainActivity.java досье.

Любая помощь будет очень признательна.

 public class MainActivity extends AppCompatActivity {
    private WebView mywebView;
    @SuppressLint("SetJavaScriptEnabled")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        BottomNavigationView bottomNav = findViewById(R.id.bottom_navigation);
        bottomNav.setOnNavigationItemSelectedListener(navListener);
        //I added this if statement to keep the selected fragment when rotating the device
        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                    new HomeFragment()).commit();
        }

    }
    private BottomNavigationView.OnNavigationItemSelectedListener navListener =
            new BottomNavigationView.OnNavigationItemSelectedListener() {
                @Override
                public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                    Fragment selectedFragment = null;
                    switch (item.getItemId()){
                        case R.id.nav_home:
                            selectedFragment = new HomeFragment();
                            break;
                        case R.id.nav_inbox:
                            selectedFragment = new InboxFragment();
                            break;
                        case R.id.nav_orders:
                            selectedFragment = new OrdersFragment();
                            break;
                        case R.id.nav_notifications:
                            selectedFragment = new NotificationsFragment();
                            break;
                        case R.id.nav_account:
                            selectedFragment = new MyaccountFragment();
                            break;
                    }
                    getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                            selectedFragment).commit();

                    return true;
                }
            };
}
  

Редактировать:
Это один из моих фрагментов: NotifcationFragment. Другие фрагменты почти похожи на этот.

 public class NotificationsFragment extends Fragment {

    String ShowOrHideWebViewInitialUse = "show";
    private WebView myWebView ;
    private ProgressBar spinner;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View myView = inflater.inflate(R.layout.fragment_notifications,container,false);
        myWebView = myView.findViewById(R.id.WebView3);
        spinner = myView.findViewById(R.id.progressBar3);

        myWebView.loadUrl("example.com/notifications");

        myWebView.setWebViewClient(new CustomWebViewClient()
                                   {
                                       @Override
                                       public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                                           return false;
                                       }
                                   }
        );
        myWebView.getSettings().setJavaScriptEnabled(true);
        myWebView.getSettings().setDomStorageEnabled(true);
        myWebView.setOverScrollMode(WebView.OVER_SCROLL_NEVER);


        return myView;
    }

    // This allows for a splash screen
    // (and hide elements once the page loads)
    private class CustomWebViewClient extends WebViewClient {

        @Override
        public void onPageStarted(WebView webview, String url, Bitmap favicon) {

            // only make it invisible the FIRST time the app is run
            if (ShowOrHideWebViewInitialUse.equals("show")) {
                webview.setVisibility(myWebView.INVISIBLE);
            }
        }

        @Override
        public void onPageFinished(WebView view, String url) {

            ShowOrHideWebViewInitialUse = "hide";
            spinner.setVisibility(View.GONE);

            view.setVisibility(myWebView.VISIBLE);
            super.onPageFinished(view, url);
            view.loadUrl("javascript:(function() { "  
                    "var foot = document.getElementsByClassName('footer-wrapper')[0].style.display='none'; "  
                    "var arrow = document.getElementsByClassName('scroll-to-top-wrapper')[0].style.display='none'; "  
                    "var head = document.getElementsByClassName('new-menu responsive')[0].style.display='none'; "  
                    "})()");
        }

    }

}
  

Ответ №1:

То, как вы реализовали, когда пользователь переключается между вкладками панели навигации, всегда создает новые фрагменты. Затем он должен быть обновлен. Если вы не хотите обновлять каждый раз, когда пользователь переходит между вкладками, вам необходимо изменить код следующим образом:

Определите создание фрагментов вверху в классе, например: private HomeFragment homeFragment = new HomeFragment(); (сделайте и для других фрагментов)

Затем в прослушивателе просмотра навигации выполните следующие действия

 > case R.id.nav_home:
>       selectedFragment = homeFragment;
>       break;
  

сделайте и для других фрагментов

 public class MainActivity extends AppCompatActivity {

private WebView mywebView;
private HomeFragment homeFragment = new HomeFragment();
private InboxFragment inboxFragment = new InboxFragment();
private OrdersFragment ordersFragment = new OrdersFragment();
private NotificationsFragment notificationsFragment = new NotificationsFragment();
private MyaccountFragment myAccountFragment = new MyaccountFragment();
@SuppressLint("SetJavaScriptEnabled")
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    BottomNavigationView bottomNav = findViewById(R.id.bottom_navigation);
    bottomNav.setOnNavigationItemSelectedListener(navListener);
    //I added this if statement to keep the selected fragment when rotating the device
    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                new HomeFragment()).commit();
    }

}
private BottomNavigationView.OnNavigationItemSelectedListener navListener =
        new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                Fragment selectedFragment = null;
                switch (item.getItemId()){
                    case R.id.nav_home:
                        selectedFragment = homeFragment;
                        break;
                    case R.id.nav_inbox:
                        selectedFragment = inboxFragment;
                        break;
                    case R.id.nav_orders:
                        selectedFragment = ordersFragment;
                        break;
                    case R.id.nav_notifications:
                        selectedFragment = notificationsFragment;
                        break;
                    case R.id.nav_account:
                        selectedFragment = myAccountFragment;
                        break;
                }
                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                        selectedFragment).commit();

                return true;
            }
        };
  

}

Комментарии:

1. Большое вам спасибо! Теперь приложение загружает те же фрагменты без перезагрузки. Однако у каждого фрагмента есть webview, который все еще перезагружается при переключении. На самом деле это был мой главный вопрос. Есть ли способ предотвратить перезагрузку webview и загрузить все webview при запуске приложения?

2. Но в соответствии с вашим кодом каждый раз, когда вы создаете новый фрагмент при переключении между вкладками, например: — case R.id.nav_home: selectedFragment = new HomeFragment(); break; Можете ли вы попробовать одноразовое создание нового фрагмента, как в моем примере, и, пожалуйста, дайте мне знать, работает ли это.

3. Я отредактировал вопрос, чтобы включить один из моих фрагментов. С изменениями, которые вы предложили, он построил успешно. Но каждый фрагмент является webview. Поэтому он загружается снова, если я перехожу к другим фрагментам. Я хочу загрузить все фрагменты webview и никогда не загружать их снова.