Пользовательский диалог Выполнение NPE - PullRequest
0 голосов
/ 15 марта 2012

Я держу свои предупреждения и диалоги в отдельном классе, чтобы предотвратить беспорядок. В моей деятельности у меня есть 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>

Ответы [ 2 ]

1 голос
/ 15 марта 2012

Попробуйте установить

View layout = inflater.inflate(R.layout.dashboard_dialog, (ViewGroup) findViewById(R.id.layout_root));

до

View layout = inflater.inflate(R.layout.dashboard_dialog, null);

Я считаю, что прикрепление представлений к контейнеру редко (если вообще когда-либо) работает, и если предположить, что "layout_root" как-то связан с вашей деятельностью, Dialog не сможет найти это представление в любом случае.

0 голосов
/ 15 марта 2012

Удалить из класса AlertsAndDialogs:

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;
      }

и добавить это:

public static void dashBoard(Context mContext)
    {
    AlertDialog.Builder builder;
    Dialog dbDialog;

    LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(LAYOUT_INFLATER_SERVICE);
    View layout = inflater.inflate(R.layout.dashboard_dialog, null);

    builder = new AlertDialog.Builder(mContext);
    builder.setView(layout);
    dbDialog = builder.create();
    dbDialog.show();
    }

Внутри класса JavaScriptInterface замените вызов:

public void showDashBoard()
    {
    AlertsAndDialogs.dashBoard(mContext);
    }
...