Android WebView应用SwipeRefreshLayout刷新跳转首页问题求助
问题根源分析
你的问题出在下拉刷新时调用的LoadWeb()方法硬编码了Home页面的URL,不管当前WebView显示的是哪个页面,每次刷新都会强制加载Home页面,所以才会出现Candidate List页面刷新后跳回Home的情况。
另外,你的LoadWeb()方法每次都会重新获取WebView实例并重复配置WebSettings,这不仅冗余,还可能导致不必要的问题。
解决方案
我们需要保存当前WebView正在加载的URL,下拉刷新时重新加载这个保存的URL,而不是固定的Home地址。同时优化WebView的初始化逻辑,只做一次配置。
步骤1:添加成员变量保存当前URL
在navigation类中添加一个私有成员变量,用来记录当前WebView加载的URL:
public class navigation extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { WebView webView; SwipeRefreshLayout swipeRefreshLayout; private AdView mAdView; final String TAG = this.getClass().getName(); // 添加这行,保存当前URL private String currentUrl; // ...其余代码... }
步骤2:优化WebView初始化逻辑
把WebView的配置和初始化移到onCreate()方法中,只执行一次,避免重复操作:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_navigation); // ...Toolbar、DrawerLayout等初始化代码... // 初始化WebView并配置参数(只做一次) webView = (WebView) findViewById(R.id.webView); WebSettings webSettings = webView.getSettings(); webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH); webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); webSettings.setAppCacheEnabled(true); webSettings.setDomStorageEnabled(true); webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS); webSettings.setUseWideViewPort(true); webSettings.setSavePassword(true); webSettings.setEnableSmoothTransition(true); webSettings.setJavaScriptEnabled(true); // 设置下载监听 webView.setDownloadListener(new DownloadListener() { public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) { Intent i = new Intent(Intent.ACTION_VIEW); i.setData(Uri.parse(url)); startActivity(i); } }); // 设置WebViewClient,页面加载完成后更新当前URL并停止刷新 webView.setWebViewClient(new WebViewClient(){ @Override public void onPageFinished(WebView view, String url) { swipeRefreshLayout.setRefreshing(false); // 更新当前URL,处理网页内部跳转的情况 currentUrl = url; } }); // 初始化下拉刷新监听 swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe); swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { LoadWeb(); } }); // 设置初始URL为Home页面 currentUrl = "http://www.gujaratuniversity.ac.in/web/"; LoadWeb(); // ...广告初始化代码... }
步骤3:修改LoadWeb()方法
让它加载保存的currentUrl,而不是硬编码的Home地址:
public void LoadWeb(){ // 检查URL和WebView是否有效 if(currentUrl != null && webView != null){ webView.loadUrl(currentUrl); } }
步骤4:更新导航菜单点击事件
每次切换页面时,更新currentUrl的值:
@Override public boolean onNavigationItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.nav_home) { currentUrl = "http://www.gujaratuniversity.ac.in/web/"; webView.loadUrl(currentUrl); setTitle("Home"); } else if (id == R.id.nav_result) { currentUrl = "http://result.gujaratuniversity.ac.in/"; webView.loadUrl(currentUrl); setTitle("Result"); } else if (id == R.id.nav_examschedule) { currentUrl = "http://www.gujaratuniversity.ac.in/web/custom/student/examination-schedule"; webView.loadUrl(currentUrl); setTitle("Exam Schedule"); } else if (id == R.id.nav_seatingarrangement) { currentUrl = "http://www.gujaratuniversity.ac.in/web/custom/student/seating-arrangement"; webView.loadUrl(currentUrl); setTitle("Seating Arrangement"); } else if (id == R.id.nav_candidate) { currentUrl = "http://www.gujaratuniversity.ac.in/web/custom/student/candidate-list"; webView.loadUrl(currentUrl); setTitle("Candidate List"); } else if (id == R.id.nav_oldquestionpapers) { currentUrl = "http://sampada.inflibnet.ac.in/"; webView.loadUrl(currentUrl); setTitle("Old Question Papers"); } else if (id == R.id.nav_syllabus) { currentUrl = "http://www.gujaratuniversity.ac.in/web/custom/student/syllabus"; webView.loadUrl(currentUrl); setTitle("Syllabus"); } else if (id == R.id.nav_antiragging) { currentUrl = "http://www.gujaratuniversity.ac.in/web/custom/pdfs/anti-ragging"; webView.loadUrl(currentUrl); setTitle("Anti Ragging"); } else if (id == R.id.nav_about) { currentUrl = "http://www.gujaratuniversity.ac.in/web/page/overview"; webView.loadUrl(currentUrl); setTitle("About"); } DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); drawer.closeDrawer(GravityCompat.START); return true; }
为什么这样修改?
- 保存当前URL:确保下拉刷新时加载的是用户当前浏览的页面,而不是默认的Home页面。
- WebView只初始化一次:避免重复调用
findViewById和重复配置WebSettings,提升性能并减少潜在问题。 - 监听页面跳转:在
onPageFinished中更新currentUrl,即使用户在页面内部点击链接跳转,刷新也能停留在跳转后的页面。
内容的提问来源于stack exchange,提问作者Abhishek Diwakar
相关产品推荐
相关产品推荐

