petitviolet_blog

@petitviolet blog

TextViewにurlを埋め込んで、タップでWebViewを開く

TextViewに対して動的にurlを埋め込み、それを開く。

  1. ブラウザ
  2. アプリ内のWebView

のそれぞれでの開きかた

ブラウザを開く場合

TextViewにリンクを埋め込んだテキストを入れて、それをタップした時に、ブラウザを起動してそのリンク先を開くようにする

// SampleActivity.javaとする
TextView tv =  (TextView) findViewById(id.tv_link);
// tvをclickableにする
MovementMethod mMethod = LinkMovementMethod.getInstance();
tv.setMovementMethod(mMethod);
String url = "http://www.google.co.jp";
// urlをhtmlを使ってリンクテキストに埋め込む
CharSequence link = Html.fromHtml("<a href=\"" + url + "\">リンクテキスト</a>");
tv.setText(link);

これでOKです。

WebViewで開く場合

ここからが本番
TextViewに埋め込んだリンクを外部アプリであるブラウザではなく、アプリ内のWebViewで開くためには、
まず対象TextViewのonClickをoverrideして、Intentで別のActivityにurlを渡すようにし、
遷移先のActivityではそのurlをWebViewを使って表示するように実装すれば良い

// 上記コードからの続き
tv.setOnClickListener(new View.OnClickListener() {			
	@Override
	public void onClick(View v) {
		// 遷移先はWebViewFromTextView.javaとする
		Intent i = new Intent(SampleActivity.this, WebViewFromTextView.class);
		i.setAction(Intent.ACTION_VIEW);
		i.setData(Uri.parse(url));
		startActivity(i);				
	}
});

これでSampleActivity.javaはOKです。
続いてWebViewFromTextView.java

public class WebViewFromTextView extends Activity {

    @SuppressLint("SetJavaScriptEnabled")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate( savedInstanceState );
        // WebViewを置いているのはweb_view.xml
        setContentView(R.layout.web_view);
        if( savedInstanceState == null ) {
        	// SampleActivity.javaからurlを受け取っている
            String url = getIntent().getDataString();
            Log.d("WebViewFromTextView:", url);
            
            // WebViewの設定
            // 表示するWebViewのidをwebViewとしている
        	WebView webView = (WebView)findViewById(R.id.webView); 
        	// focusが当たるように。いらないかも
        	webView.requestFocus();
        	// jsの有効化(XSSの恐れがあるため怒られるが...)
        	webView.getSettings().setJavaScriptEnabled(true);
        	// ズーム出来るように
        	webView.getSettings().setBuiltInZoomControls(true);
        	// クライアント作成
        	webView.setWebViewClient(new WebViewClient());
        	// ここでurl読み込み
    		webView.loadUrl(url);
        }
    }
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
    	// webviewでbackボタンが押下された時、履歴を戻れるなら戻り、戻れないなら前のActivityに戻る
        WebView webview = (WebView)findViewById(R.id.webView);
    	if (keyCode == KeyEvent.KEYCODE_BACK && webview.canGoBack()) {
    		webview.goBack();
    		return true;
        }
        return super.onKeyDown(keyCode, event);
    }
}

としたらOKでしょう。
WebView内でbackボタンが押された場合に前のActivityまで戻ってしまうので、
backボタンの挙動をOverrideしています。

注意事項

AndroidManifest.xmlに遷移先にActivityを加えること、internet通信を許可することを忘れないように。