应用程序包含两个活动:第一个 - listview包含指向资产的html文件的链接,第二个 - 带有此html文件的webview。所以这个html文件中有一些链接(下一个我称之为第一个html文件),导致其他html文件来自资产。在我按照其中一个链接后,我想回到第一个html。但是这种方法显示的是白屏而不是文件的内容。
PS:我通过html链接引用第一个资产文件。例如(第一个html中的链接代码):
<a href="file:///android_asset/second.html">Second file</a>
这是 WebViewActivity 代码:
public class WebViewActivity extends Activity implements OnClickListener {
WebView wWebView;
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
if (wWebView.canGoBack() == true) {
wWebView.goBack();
} else {
finish();
}
return true;
}
}
return super.onKeyDown(keyCode, event);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Bundle bundle = getIntent().getExtras();
String htmlFileName = "m" + bundle.getString("defStrID") + ".html";
Context context = getBaseContext();
try {
String text = readAssetTextFile(context, htmlFileName);
wWebView = (WebView) findViewById(R.id.webview);
String summary = "<html><body>" + text + "</body></html>";
wWebView.getSettings().setJavaScriptEnabled(true);
wWebView.loadDataWithBaseURL("x-data://base", summary, "text/html",
"utf-8", null);
} catch (IOException e) {
Log.e("TAG", "Exception thrown", e);
}
}
public static String readAssetTextFile(Context ctx, String fileName)
throws IOException
{
InputStream inputStream = ctx.getAssets().open(fileName);
InputStreamReader inputreader = new InputStreamReader(inputStream);
BufferedReader buffreader = new BufferedReader(inputreader);
String line;
StringBuilder text = new StringBuilder();
try {
while ((line = buffreader.readLine()) != null) {
text.append(line);
text.append('\n');
}
} catch (IOException e) {
Log.e("TAG", "Exception thrown", e);
}
return text.toString();
}
}
答案 0 :(得分:2)
我使用Back按钮,如下所示:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
mWebView.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
这种方法的优点是它不会耗尽任何屏幕,
答案 1 :(得分:1)
您的问题是wWebView
类成员变量未初始化,因此它为null。看到你的代码的这一部分:
WebView wWebView = (WebView) findViewById(R.id.webview);
完美,你正在初始化,但不是你的想法:你为方法声明一个局部变量并初始化它。但是,由于具有相同名称的局部变量,您会影响类成员wWebView
。因此,您不初始化类成员,它是null并且您得到您的NPE。将上面的行更改为(注意缺少类型):
wWebView = (WebView) findViewById(R.id.webview);
编辑我从来没有能够在页面之间进行导航工作。但是我对您的onCreate
方法做了一些更改,现在我的设备上的一切似乎都很好了:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);
TextView title = (TextView) findViewById(R.id.app_name);
title.setText(getString(R.string.app_name));
Button backButton = (Button) findViewById(R.id.button_back);
backButton.setOnClickListener(this);
Button infoButton = (Button) findViewById(R.id.button_info);
infoButton.setOnClickListener(this);
Bundle bundle = getIntent().getExtras();
String htmlFileName = "m" + bundle.getString("defStrID") + ".html";
String LINK_TO_ASSETS = "file:///android_asset/";
wWebView = (WebView) findViewById(R.id.webview);
wWebView.getSettings().setJavaScriptEnabled(true);
wWebView.loadURL(LINK_TO_ASSETS + htmlFileName);
}
现在您还需要更改加载的htmls的内容。首先在资产中的每个文件的开头添加<html><body>
,在结尾添加</body></html>
。其次,您需要更改链接。例如,您在问题中包含的链接:
<a href="second.html">Second file</a>
如您所见,这些现在成为相对链接。所有这些更改可能会使您readAssetTextFile
无用,但我相信这更容易理解代码。