我的ViewSwitcher中有ListView
和WebView
。在我的ListView的适配器中,我有一个onclick监听器,它将列表中单击的url写入sharedpreferences。我正在尝试使用onSharedPreferencesChangedListener
将该网址加载到WebView中。
这是我的适配器中的代码:
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewSwitcher.showNext();
Settings.writeSettings(context, "webviewUrl",
urls.get(position));
}
});
return convertView;
在偏好倾听者中:
@Override
public void onSharedPreferenceChanged(SharedPreferences pref, String key) {
if (key.equals("webviewUrl")) {
Log.d("TAG", pref.getString(key, null));
WebView wv = (WebView) findViewById(R.id.rss_webview);
wv.getSettings().setJavaScriptEnabled(true);
wv.setWebViewClient(new MyWebViewClient());
wv.loadUrl("about:blank");
wv.loadUrl(pref.getString(key, null));
}
}
除非只能使用一次,否则效果很好。首选项侦听器代码记录正确的URL,并且每次我想要时都会执行代码,但wv.loadUrl()
方法在第一次成功调用后似乎什么都不做。任何人都可以向我解释为什么会发生这种情况并提供解决方案吗?感谢。
答案 0 :(得分:0)
我通过在WebView
上实现一个静态ViewHolder解决了这个问题,我需要保留比其视图生命周期更长的引用。
private static final class WebViewHolder {
WebView wv;
}
@Override
public void onSharedPreferenceChanged(SharedPreferences pref, String key) {
WebViewHolder holder = new WebViewHolder();
if (key.equals("webviewUrl")) {
if (wv == null) {
wv = new WebView(this);
holder.wv = (WebView) findViewById(R.id.rss_webview);
holder.wv.getSettings().setJavaScriptEnabled(true);
holder.wv.setWebViewClient(new MyWebViewClient());
wv.setTag(holder);
} else {
holder = (WebViewHolder) wv.getTag();
}
holder.wv.loadUrl("about:blank");
holder.wv.loadUrl(pref.getString(key, null));
}
}