2012-02-22 2 views
0

アプリケーションは、アセットのhtmlファイルへのリンクを含むfirst-listview、このhtmlファイルのsecond-webviewの2つのアクティビティで構成されます。だから、このhtmlファイルにはいくつかのリンクがあり(次は最初のhtmlファイルと呼ばれます)、アセットから他のhtmlファイルにつながります。私がこのリンクの1つをたどった後、私は最初のhtmlに戻りたいと思います。しかし、この方法では、ファイルの内容の代わりに白い画面が表示されます。webviewで戻るボタンを作成するには?

PS:最初のアセットファイルをhtmlリンクで参照しています。例えば、(第一のHTML内のリンクのコード):

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) { 
     mWebView.goBack(); 
     return true; 
    } 
    return super.onKeyDown(keyCode, event); 
} 

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

'onKeyDown'の96行目はどれですか? –

+0

質問が更新されましたので、29行目(96番目)が 'if(wWebView.canGoBack()== true){' – Sabre

答えて

1

あなたの問題は、wWebViewのクラスメンバー変数が初期化されていないため、nullです。あなたのコードのこの部分を参照してください。あなたがメソッドのローカル変数を宣言して初期化:

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

パーフェクト、あなたはあなたが何を考えて初期化しますが、されていません。ただし、同じ名前のローカル変数のため、クラスメンバーwWebViewをシャドウします。したがって、あなたはクラスメンバーを初期化しません、それはnullであり、あなたはあなたのNPEを取得します。 (タイプが存在しないことに注意)に上記の行を変更します。

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

EDIT私は仕事ページ間を移動するのあなたの方法を作ることができませんでした。しかし、私はあなたの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が役に立たなくなる可能性がありますが、これはコードを理解しやすくなります。

+0

ありがとう、これは私の問題を部分的に解決しました。しかし、2番目のhtmlファイルを押すと、画面が白くなります(ここでは最初のページになります)。その後、もう一度やり直すと、アプリはリストビューを表示します。最初のページを表示するにはどうすればよいですか? – Sabre

+0

htnlsを切り替える方法について少し詳しく教えてください。それはあなたが最初のビューで従うリンクですか?または、それを行ういくつかのアンドロイドコードがありますか? –

+0

もちろん、アプリは2つのアクティビティで構成されています。アセットのhtmlファイルへのリンクを含むfirst-listview、このhtmlファイルのsecond-webviewです。したがって、このhtmlファイルにはいくつかのリンクがあります(次は最初のhtmlファイルと呼びます)。私がこのリンクの1つをたどった後、私は最初のhtmlに戻りたいと思います。しかし、この方法ではファイルの代わりに白い画面が表示されます。 – Sabre

2

次のように私は、戻るボタンを使用する:ここ

<a href="file:///android_asset/second.html">Second file</a> 

WebViewActivityコードでありますこのアプローチの利点は、画面のいずれも使用しないことです。

+0

になりました。それはアプリをクラッシュさせます。私はこれを行うと思います。私は歴史を閲覧する必要があります。そうですか? – Sabre

+0

いいえ、まったくありません。しかし、私はあなたのためにあなたのアプリをデバッグすることはできません。 –

+0

logcatを見て、何をすべきかアドバイスできますか? – Sabre

関連する問題