【问题标题】:NullPointerException while inflating custom toast message in shouldOverrideUrlLoading() method在 shouldOverrideUrlLoading() 方法中膨胀自定义 toast 消息时出现 NullPointerException
【发布时间】:2015-07-30 10:09:59
【问题描述】:

我有一个显示 webView 的应用程序,每次在 webView 中加载 url 时,我都会尝试显示一条自定义 toast 消息,上面写着“请稍候”.. 所以我在 shouldOverrideUrlLoading(WebView 视图中添加了这个自定义 toast 消息, String url) 方法.. 如果我启动应用程序并等待 url 加载,该应用程序工作正常..并且在加载 url 时也会出现该消息..

当我启动应用程序然后突然退出它时出现问题.. 没有等待 url 加载.. 应用程序崩溃给我一个空指针异常 --

LayoutInflater iflater = (LayoutInflater)getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

我无法找到防止此异常和应用程序崩溃的方法-

这是我的代码-

public boolean shouldOverrideUrlLoading(WebView view, String url) {
        Log.i(TAG, "About to load:" + url);
        view.loadUrl(url);

        LayoutInflater nflater = (LayoutInflater)getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View layout = nflater.inflate(R.layout.toast2,
                (ViewGroup) getActivity().findViewById(R.id.tl1));
         TextView textv = (TextView) layout.findViewById(R.id.text);
         textv.setText(R.string.loading);
         final Toast ltoast = new Toast(getActivity());
         ltoast.setView(layout);
         ltoast.show();

         new CountDownTimer(9000, 1000)
         {

             public void onTick(long millisUntilFinished) {ltoast.show();}
             public void onFinish() {ltoast.show();}

         }.start();


        return true;
    }

这是我的 Logcat 中的错误-

07-30 15:26:25.429: E/AndroidRuntime(8701): FATAL EXCEPTION: main
07-30 15:26:25.429: E/AndroidRuntime(8701): java.lang.NullPointerException
07-30 15:26:25.429: E/AndroidRuntime(8701):     at        com.example.itslive.web1Activity$HelloWebViewClient.shouldOverrideUrlLoading(web1Activity.java:673)
 07-30 15:26:25.429: E/AndroidRuntime(8701):    at android.webkit.CallbackProxy.handleMessage(CallbackProxy.java:384)
07-30 15:26:25.429: E/AndroidRuntime(8701):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-30 15:26:25.429: E/AndroidRuntime(8701):     at android.os.Looper.loop(Looper.java:137)
07-30 15:26:25.429: E/AndroidRuntime(8701):     at android.app.ActivityThread.main(ActivityThread.java:4921)
07-30 15:26:25.429: E/AndroidRuntime(8701):     at java.lang.reflect.Method.invokeNative(Native Method)
07-30 15:26:25.429: E/AndroidRuntime(8701):     at java.lang.reflect.Method.invoke(Method.java:511)
07-30 15:26:25.429: E/AndroidRuntime(8701):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
07-30 15:26:25.429: E/AndroidRuntime(8701):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
07-30 15:26:25.429: E/AndroidRuntime(8701):     at dalvik.system.NativeStart.main(Native Method)

这是我的 toast2.xml 文件...

 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/tl1"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:orientation="vertical" >

  <TextView android:id="@+id/text"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:textColor="@color/blue"
          android:paddingLeft="30dp"
          android:paddingRight="30dp"
          />
  </LinearLayout>

【问题讨论】:

  • 如果你在膨胀代码中得到 NPE,原因似乎是因为 getActivity() 为空。那为什么它是空的?它通常与片段的生命周期有关。请检查一下。如果您仍然不知道为什么,请在加载 url 和片段生命周期代码时显示更多代码
  • @Minhtdh 请检查'@Niv'答案下的第 3 行段落。这对我有用.. 使用 FragmentActivity fragActivity = getActivity();

标签: android webview nullpointerexception layout-inflater android-toast


【解决方案1】:

试试像这样吐司看看。

public void showCustomAlert()
{

    Context context = getActivity();
    // Create layout inflator object to inflate toast.xml file
    LayoutInflater inflater = getActivity().getLayoutInflater();

    // Call toast.xml file for toast layout
    View toastRoot = inflater.inflate(R.layout.list_adapter, null);

    Toast toast = new Toast(context);

    // Set layout to toast
    toast.setView(toastRoot);
    toast.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL,
            0, 0);
    toast.setDuration(Toast.LENGTH_LONG);
    toast.show();

}

那么你必须做一件事。将 FragmentActivity 的对象设为 onCreateView FragmentActivity fragActivity=getActivity();那么你必须调用 LayoutInflater inflater = fragActivity.getLayoutInflater();在你的 shouldOverrideUrlLoading 方法中

【讨论】:

  • 这与我在代码中编写的内容有何不同..?我在 - LayoutInflater nflater = (LayoutInflater)getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 处收到空指针异常
  • 查看编辑后的代码,让我知道它是否适合您。就我而言,它成功了
  • 我试过你的代码,但问题是..我只在这一行得到 nullpointerexception - LayoutInflater inflater = getActivity().getLayoutInflater(); ...类似于我的代码..对 LayoutInflater 的调用是给 NPE 的原因.. toast 本身很好.. layoutinflater 是问题....
  • 我编辑了我的问题并添加了我试图充气的 toast2.xml 文件。里面只有一个 textview 。所以它真的是 LayoutInflater 。事情是......我仅当我在启动应用程序后立即退出应用程序时才获得此 NPE.. 无需等待 url 加载..
  • 那你必须做一件事。将 FragmentActivity 的对象设为 onCreateView FragmentActivity fragActivity=getActivity();那么你必须调用 LayoutInflater inflater = fragActivity.getLayoutInflater();在你的 shouldOverrideUrlLoading 方法中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-16
  • 1970-01-01
  • 2015-11-05
  • 1970-01-01
  • 2011-11-22
  • 1970-01-01
相关资源
最近更新 更多