Я держу свои предупреждения и диалоги в отдельном классе, чтобы предотвратить беспорядок. В моей деятельности у меня есть webView, а в документе HTML есть кнопка, которая запускает пользовательский диалог в Android. Я использую JavaScriptInterface для связи между функциями JavaScript в документах HTML и Java-методами Android. Все это прекрасно работает с моими сообщениями тостов и другими функциями между собой, за исключением этого настраиваемого диалога.
ОБНОВЛЕНИЕ:
Я сделал некоторые изменения, и теперь, по крайней мере, я получаю NPE, за которым я не могу следовать. Я переместил метод Dialog в JavaInterface, чтобы упростить его отладку и некоторые другие изменения; см. комментарии в коде.
Я не знаю, что у меня не так. Я не получаю информацию об ошибке в LogCat с этим; просто принудительно закрывает приложение ... ?? Пожалуйста, посмотрите мой код ниже.
Спасибо за вашу помощь !!
LogCat:
Пропустите перетаскивание, поскольку мы ждем ответа WebCore для приземления.
threadid = 9: поток завершается с необработанным исключением (группа = 0x4024ee20)
Неустранимое исключение: WebViewCoreThread java.lang.NullPointerException
на android.app.Activity.findViewById (Activity.java:1745) на
com.andaero.JavaScriptInterface.onCreateDialog (JavaScriptInterface.java:45)
на android.app.Activity.onCreateDialog (Activity.java:2758) на
android.app.Activity.createDialog (Activity.java:936) в
android.app.Activity.showDialog (Activity.java:2851) в
android.app.Activity.showDialog (Activity.java:2810) в
com.andaero.JavaScriptInterface.showDashBoard (JavaScriptInterface.java:32)
на android.webkit.WebViewCore.nativeTouchUp (собственный метод) на
android.webkit.WebViewCore.nativeTouchUp (собственный метод) в
android.webkit.WebViewCore.access $ 3600 (WebViewCore.java:52) в
android.webkit.WebViewCore $ EventHub $ 1.handleMessage (WebViewCore.java:1340)
на android.os.Handler.dispatchMessage (Handler.java:99) на
android.os.Looper.loop (Looper.java:132) в
android.webkit.WebViewCore $ WebCoreThread.run (WebViewCore.java:723)
at java.lang.Thread.run (Thread.java:1020)
Класс оповещений и диалогов:
public class AlertsAndDialogs extends Activity
{
public final int CATEGORY_ID = 0;
. . .
//Moved to the JavaScriptInterface Class ----->
/* protected Dialog onCreateDialog(int id)
{
Dialog dialog;
switch (id)
{
case CATEGORY_ID:
AlertDialog.Builder builder;
Context mContext = this;
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.dashboard_dialog, (ViewGroup) findViewById(R.id.webView));
builder = new AlertDialog.Builder(mContext);
builder.setView(layout);
dialog = builder.create();
break;
default:
dialog = null;
}
return dialog;
}*/
}
Класс JavaScriptInterface:
public class JavaScriptInterface extends AlertsAndDialogs
{
public final int CATEGORY_ID = 0;
Context mContext;
/** Instantiate the interface and set the context */
JavaScriptInterface(Context c)
{
mContext = c;
}
. . .
/** Show the DashBoard from the web page */
public void showDashBoard()
{
showDialog(CATEGORY_ID);
}
protected Dialog onCreateDialog(int id)
{
Dialog dialog;
switch (id)
{
case CATEGORY_ID:
AlertDialog.Builder builder;
//Context mContext = this;
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.dashboard_dialog, (ViewGroup) findViewById(R.id.layout_root));
builder = new AlertDialog.Builder(mContext);
builder.setView(layout);
dialog = builder.create();
break;
default:
dialog = null;
}
return dialog;
}
. . .
}
В основном действии, содержащем WebView:
. . .
myWebView.addJavascriptInterface(new JavaScriptInterface(this), "Android");
. . .
Функция HTML:
<script type="text/javascript">
function showDashBoardFunction() {
Android.showDashBoard();
}
</script>