如何在webview中创建后退按钮?

时间:2012-02-22 21:20:56

标签: android android-webview back-button

应用程序包含两个活动:第一个 - 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();
    }
}

2 个答案:

答案 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无用,但我相信这更容易理解代码。