0

私は自分のアプリケーションのヘルプシステムを書いています。AlertDialog内でWebViewを使用しています。HTMLヘルプページはassets/ディレクトリに保存され、相互にリンク参照されます。問題を再現するための最小限のコード:

package qa.so.wv;

import android.content.Context;
import android.app.AlertDialog;
import android.webkit.WebView;
import android.content.DialogInterface;
import android.view.ContextThemeWrapper;
import android.webkit.WebSettings;
import android.webkit.WebViewClient;
import android.widget.Toast;

public class DialogInformation {


    public void showFile(Context context, String file) {

        AlertDialog.Builder dialog = new AlertDialog.Builder(new ContextThemeWrapper(context, R.style.InformationDialogStyle));

        final Context ctx = context;    
        final WebView wv = new WebView(context);
        wv.setWebViewClient(
            new WebViewClient(){
                    public boolean shouldOverrideUrlLoading(WebView view, String url) {
                        view.loadUrl(url);
                        return true;
                    }
            }
        );
        WebSettings settings = wv.getSettings();
        settings.setDefaultTextEncodingName("utf-8");
        wv.loadUrl(
            "file:///android_asset/"+file
            );

        dialog.setView(wv);

        dialog.setPositiveButton(
            context.getString(R.string.cont),
            new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                }
            }
        ); 
        dialog.setNeutralButton(
            "Back",
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    if (wv.isFocused() && wv.canGoBack()) {
                        wv.goBack();
                    } else {
                        Toast.makeText(
                            ctx, 
                            "No go back for Back button", 
                            Toast.LENGTH_LONG
                        ).show();
                    }
                }
            }
        );
        dialog.setOnCancelListener(
            new DialogInterface.OnCancelListener() {         
                @Override
                    public void onCancel(DialogInterface dialog) {
                    if (wv.isFocused() && wv.canGoBack()) {
                        wv.goBack();
                    } else {
                        Toast.makeText(
                            ctx, 
                            "No go back for system return 'hardware' button",
                            Toast.LENGTH_LONG
                        ).show();
                    }
                    }
            }
        );
        dialog.show();
    }

}

このクラスはそこで使用されます:

package qa.so.wv;

import android.os.Bundle;
import android.app.ListActivity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.view.MenuItem;
import android.view.Menu;
import android.widget.Toast;
import android.webkit.WebView;

public class ShowArchive extends ListActivity
{

    // options menu items constants
    protected static final int MENU_HELP = Menu.FIRST+11;
    protected static final int MENU_QUIT = Menu.FIRST+16;


    @Override
    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    }


    /* Create Menu Items */
    public boolean onCreateOptionsMenu(Menu menu) {
        menu.add(0, MENU_HELP, 0, R.string.menu_help);
        menu.add(0, MENU_QUIT, 0, R.string.menu_quit);
        return true;
    }

    /* Handles Menu Item Selection */
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case MENU_HELP:
                DialogInformation dn = new DialogInformation();
                dn.showFile(    
                    this,
                    getString(R.string.help_file)
                );
                return true;    

            case MENU_QUIT:
                finish();
                return true;

        }
        return false;
    }

}

そして、assets /ディレクトリページ1からの2つのサンプルページ:

<html>
<a href="second.html">link to 2-nd file"</a>
<p>
Some text.
</p>
</html>

および2ページ目:

<html>
<p>2-nd file</p>
</html>     

メニューから「ヘルプ」と呼びます。1ページ目が表示されます。クリックしてリンクします。2ページ目が正しく読み込まれました。 「戻る」ボタンまたはハードウェアの「キャンセル」ボタンをクリックすると、以前に表示されたページをロードする代わりに、ヘルプダイアログが消えます。

この問題を解決するのを手伝ってください。

4

1 に答える 1

1

これを試して

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
    if (event.getAction() == KeyEvent.ACTION_DOWN) {
        switch (event.getKeyCode()) {
        case KeyEvent.KEYCODE_BACK:
            if(webView.canGoBack()) {
                 webView.goBack();
            } else {
                finish();
            }
            return true;
        }
    }
    return super.dispatchKeyEvent(event);
}
于 2012-07-31T06:58:11.237 に答える