Как создать кнопку назад в веб-просмотре? - PullRequest
0 голосов
/ 23 февраля 2012

Приложение состоит из двух действий: первое - просмотр списка со ссылками на html-файлы из ресурсов, второе - просмотр веб-страницы с этим html-файлом.Таким образом, в этом 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 ]

2 голосов
/ 23 февраля 2012

Я использую кнопку Назад, как показано ниже:

@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 голос
/ 23 февраля 2012

Ваша проблема в том, что переменная-член класса wWebView не инициализирована, поэтому имеет значение null. увидеть эту часть вашего кода:

WebView wWebView = (WebView) findViewById(R.id.webview);

Отлично, вы инициализируете, но не то, что думаете: вы объявляете локальную переменную для метода и инициализируете ее. Однако вы скрываете члена класса wWebView из-за локальной переменной с тем же именем. Таким образом, вы не инициализируете члена класса, он является нулевым, и вы получаете свой 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 бесполезным, но я считаю, что этот код легче понять.

...