我有一个webview作为主要活动,我想从另一个活动的“Preference”(列表视图)刷新webview。有可能吗?我不想在应用程序菜单上使用“刷新”按钮。
但是我在我的偏好活动上按下“刷新”后活动会崩溃,我认为是“R.id.web_engine”,即来自MainActivity布局,导致崩溃(请看下面的代码)。
如何从外部活动执行webview操作?
示例:
在我的 MainActivity 中将有
//Webview
final WebView engine = (WebView) findViewById(R.id.web_engine);
engine.loadUrl("file:///android_asset/www/index.html");
engine.getSettings().setJavaScriptEnabled(true);
和偏好设置
//Get the custom preference
Preference refreshPref = (Preference) findPreference("refreshPref");
refreshPref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference preference) {
Toast.makeText(getBaseContext(),
"Loading...",Toast.LENGTH_SHORT).show();
WebView engine = (WebView) findViewById(R.id.web_engine);
engine.loadUrl("javascript:window.location.reload();");
return true;
}
});
答案 0 :(得分:2)
此行导致崩溃
WebView engine = (WebView) findViewById(R.id.web_engine);
engine.loadUrl("javascript:window.location.reload();");
如果我理解正确,它应该是空指针崩溃,因为此Preference活动将永远无法使用此方法找到主要活动的WebView。更好的方法是广播一个意图来刷新并处理主要活动中的意图并执行操作。
在此处查看有关广播接收器的详细信息 http://thinkandroid.wordpress.com/2010/02/02/custom-intents-and-broadcasting-with-receivers/
答案 1 :(得分:1)
我同意Rahul Choudhary的意见。您的网络视图仅在主要活动中可见。你必须传递一条消息,它应该在下次可见时刷新。
此代码的正确位置在主要活动onResume()方法上。 您可以使用意图再次启动它(它将被重新创建并松开其历史记录)或使用两个活动都可访问的SharedPreferences。
编辑:在下面添加了一些代码。
MainActivity
//onCreate
final WebView engine = (WebView) findViewById(R.id.web_engine);
engine.loadUrl("file:///android_asset/www/index.html");
engine.getSettings().setJavaScriptEnabled(true);
//onResume
boolean refresh = PreferenceManager.getDefaultSharedPreferences(this).getBoolean("SHOULD_REFRESH", false)
if (refresh) {
engine.loadUrl("javascript:window.location.reload();");
//remove the shared preference here or set it to false to prevent reloading next time
}
和偏好设置
//Get the custom preference
Preference refreshPref = (Preference) findPreference("refreshPref");
refreshPref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference preference) {
PreferenceManager.getDefaultSharedPreferences(this).edit().putBoolean("SHOULD_REFRESH", true).commit();
return true;
}
});