2012-01-10 19 views
2

簡単な一般的な質問です。android startActivity from JavascriptInterface

Webviewは私のJavascriptInterfaceクラスに接続されています。しかし、JavascriptInterfaceはActivityを拡張しないので、startActivity(intent)を使って新しいアクティビティをIntentにすることはできません。

アクティビティを拡張する必要がありますか?別の活動を行う別の方法がありますか?ただ、mContext.startActivity(i)を使用

package com.privateized.moreprivate; 

import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.net.Uri; 
import android.util.Log; 
import android.widget.Toast; 

public class JavaScriptInterface { 
    Context mContext; 

    /** Instantiate the interface and set the context */ 
    JavaScriptInterface(Context c) { 
     mContext = c; 
    } 

    /** Show a toast from the web page */ 
    public void showToast(String toast) { 
     Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show(); 
    } 



    ///// vvvvv This no Worky vvvvv Just crashes //////// 
    public void YouTube(String id) { 
     Log.d("JS", "Launching YouTube:" + id); 
     Activity activity = new Activity(); 
     String videoId = id; 
     Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("vnd.youtube:"+videoId)); 
     i.putExtra("VIDEO_ID", videoId); 
     Log.d("JS", "Starting Activity"); 
     activity.startActivity(i); 
    } 

} 
+0

'アクティビティ活動は=新しい活動()持っていけないのwouldnt;' - ドン」にこれまで何もしなかった。 Androidの「Activity」クラスは、そのように直接インスタンス化されることは決してありません。 sgarmanからの回答は、必要なものに対して機能するはずです。 – Squonk

答えて

4

を(私の非常に特殊な場合には、イムは、YouTubeアプリに意図しよう)。

Activityを作成する必要はなく、Activityを拡張する必要はありません。既に保存しているContextへの参照が必要です。

+0

これは奇妙なことです。私が試したことが最初ですが、EclispeはautocompleteリストにstartActivityのリストを表示できませんでした。手動で入力したときに無効であると言われ、その後私はコンパイルさせませんでした。だから、私は正直なところで立ち去った 今でも動作するようですが、リブートするだけでEclipseが必要です:x ありがとう! – RedactedProfile

+0

私は大きなIntelliJ IDEAサポーターです。あなたの余暇時間にそれをチェックしたいかもしれません。本当に良いアンドロイドの統合をしています。 – sgarman

0

私は断片化している場合は新しいインテントを開始するソリューションを持っています。 SherlockFragments、私はほとんど時間のこの問題に苦しんでいたが、ここではuが行く:WebViewのを開く

フラグメント:

public class MyWebViewFragment extends SherlockFragment { 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    super.onCreateView(inflater, container, savedInstanceState); 

    View v = inflater.inflate(R.layout.webviewfragment, container, false); 
    WebView myWebView = (WebView) v.findViewById(R.id.webviewcontainer); 
    myWebView.getSettings().setJavaScriptEnabled(true); 
    myWebView.addJavascriptInterface(new WebAppInterface(getActivity()), 
      "Android"); 
    myWebView.loadUrl("file:///android_asset/javascript/index.html"); 

    return v; 
} 

Javascriptinterface:私が使用する理由 私はAPIレベル17に取り組んでいますが、thatsの@JavascriptInterface。 IDに注釈なしL16で動作しますが、私は、なぜ...

public class WebAppInterface { 
Context mContext; 

/** Instantiate the interface and set the context */ 
WebAppInterface(Context myWebViewFragment) { 
    mContext = myWebViewFragment; 
} 


@JavascriptInterface 
public void playFragmentActivity(long id) { 

    Intent intent = new Intent(mContext, FragmentActivity.class); 
    intent.putExtra(FragmentActivity.EXTRA_ID,Id); 
    mContext.startActivity(intent); 
} 

}

HTML

<body> 
<div> 
    <input type="button" value="Start X FragmentActivity" 
     onClick="changeFragmentActivity(183216076724928)" /> 
</div> 

<script type="text/javascript"> 

    function changeFragmentActivity(id) { 
     Android.playFragmentActivity(id); 
    } 
</script> 
</body> 
関連する問題