更改选项卡时避免/防止片段刷新

Posted

技术标签:

【中文标题】更改选项卡时避免/防止片段刷新【英文标题】:Avoid / prevent a fragment from refreshing when changing tabs 【发布时间】:2013-10-18 08:01:09 【问题描述】:

我知道有很多关于这个主题的问题,但我无法让它在我的应用程序中运行。我的问题是。我有一个带有 4 个标签的应用程序。其中 3 个中有一个 webView。每次我更改标签时,整个fragment 都会重新加载。我希望它再次加载它。所以当我失去互联网连接时,它仍然会显示打开的页面。

这是我的主要活动:

public class MainActivity extends FragmentActivity 

private FragmentTabHost TabHost;

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_main);
    //instellingen laden
    final SharedPreferences settings = getSharedPreferences("Leerling", 0); 

     //lln laden
     int lln = settings.getInt("lln", 0);   
     if(lln == 0)  

         //alert maken
         AlertDialog.Builder alert = new AlertDialog.Builder(this);
         alert.setTitle("Welkom");
         alert.setMessage("Vul je LLN in:");

         // EditText maken
         final EditText input = new EditText(this);
         input.setInputType(InputType.TYPE_CLASS_NUMBER);
         alert.setView(input);

         //ga knop
         alert.setPositiveButton("Ga", new DialogInterface.OnClickListener() 
             public void onClick(DialogInterface dialog, int whichButton) 
                 //String text = input.getEditableText().toString();
                 int lln = Integer.parseInt(input.getEditableText().toString());
                 SharedPreferences.Editor editor = settings.edit();
                 editor.putInt("lln", lln);
                 editor.commit();
               
         );
         //stop knop
         alert.setNegativeButton("Stop", new DialogInterface.OnClickListener() 
             public void onClick(DialogInterface dialog, int whichButton) 
                 // Canceled.
                 android.os.Process.killProcess(android.os.Process.myPid());
                 return;
             
         );

         alert.show();
     

     TabHost = (FragmentTabHost)findViewById(android.R.id.tabhost);
     TabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);

     //tab1 toevoegen
     TabHost.addTab(TabHost.newTabSpec("tab1").setIndicator("Rooster"), Tab1.class, null);

     //tab2 toevoegen
     TabHost.addTab(TabHost.newTabSpec("tab2").setIndicator("Pers"), Tab2.class, null);

     //tab3 toevoegen
     TabHost.addTab(TabHost.newTabSpec("tab3").setIndicator("Wijzig"), Tab3.class, null);

     //tab4 toevoegen
     TabHost.addTab(TabHost.newTabSpec("tab4").setIndicator("Extra's"), Tab4.class, null);

这是我的 Tab1:

public class Tab1 extends Fragment  

private Bundle webViewBundle;
private WebView webViewRooster;

 @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    // Inflate the layout for this fragment
    View View = inflater.inflate(R.layout.activity_tab1, container, false);

    SharedPreferences settings = getActivity().getSharedPreferences("Leerling", 0); 
    int lln = settings.getInt("lln", 0);        

    webViewRooster = (WebView) View.findViewById(R.id.webViewRooster);        
    webViewRooster.setWebViewClient(new WebViewClient());

    if (webViewBundle == null) 
        Toast.makeText(getActivity(), "geladen voor eerste x", Toast.LENGTH_SHORT).show();
        webViewRooster.loadUrl("http://www.idylank.x90x.net/rooster.php?lln=" + lln);
    
    else
        Toast.makeText(getActivity(), "tweede of meer x", Toast.LENGTH_SHORT).show();
        //webViewRooster.restoreState(webViewBundle);
    
    return View;         

public void onPause() 
    webViewBundle = new Bundle();
    webViewRooster.saveState(webViewBundle);
    super.onPause();

我尝试了很多东西...请帮助。

【问题讨论】:

如果您希望数据只加载一次(更改选项卡时不受影响),您可以在onAttach() 中加载它,在将片段附加到活动时只调用一次。 @Mahm00d 我怀疑 onAttach() 会起作用。 On attach 在 onCreate() 和 onCreateView() 之前调用。因此大多数视图项都不会运行。 @KennyWest,你是对的。虽然视图独立逻辑可以在 onAttach() 中完成,但当我再次查看他的代码时,对于 webview 这里的 onAttach() 不会是一个解决方案。感谢您指出。 【参考方案1】:

我知道这是一个疯狂的解决方法,但如果您试图为用户提供“上次查看的 html”,也许您应该考虑缓存已成功下载的 HTML,然后在再次下载失败时将此 HTML 设置回 WebView ?

防止重新加载可能更好,但如果您没有找到任何其他内容,请查看此链接以了解如何获取下载的 HTML 的副本:how to get html content from a webview?

【讨论】:

以上是关于更改选项卡时避免/防止片段刷新的主要内容,如果未能解决你的问题,请参考以下文章

删除选项卡时在 ActionBar 选项卡片段中运行代码

切换到片段选项卡主机中的选项卡时查看寻呼机丢失其内容

单击选项卡时,我想显示两个片段

保存片段状态操作栏选项卡

IllegalArgumentException:快速切换 ActionBar 选项卡时没有找到片段 id 的视图

关闭选项卡时如何防止调试器停止