当我在Fragment中创建一个ImageView时,如何解决getActivity()为null

时间:2015-08-28 02:13:13

标签: java android fragment

正如标题所说,我在我的片段中创建了一个ImageView。

    private void initBanner(String imgUrl) {

        ImageView iv = new ImageView(getActivity());
        iv.setScaleType(ScaleType.FIT_XY);
        BitmapUtils bitmapUtils = new BitmapUtils(getActivity());
        bitmapUtils.display(iv, imgUrl, new BitmapLoadCallBack<View>() {

            @Override
            public void onLoadCompleted(View arg0, String arg1, Bitmap arg2,
                    BitmapDisplayConfig arg3, BitmapLoadFrom arg4) {
                Bitmap arg = arg2;
                arg2 = null;
                arg2 = new WeakReference<Bitmap>(arg).get();
                ((ImageView) arg0).setImageBitmap(arg2);
            }

            @Override
            public void onLoadFailed(View arg0, String arg1, Drawable arg2) {

            }
        });
        bannerList.add(iv);
    }

而且,我的活动扩展到了FragmentActivity。 它并不总是发生,有时或某种特殊类型。我已经构建了一个bug 我的应用程序的收集器,所以我可以看到是什么引起的。这是一些错误信息:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference
    at android.view.ViewConfiguration.get(ViewConfiguration.java:365)
    at android.view.View.<init>(View.java:3791)
    at android.widget.ImageView.<init>(ImageView.java:131)
    at bb.h.b(SourceFile:301)
    at bb.h.a(SourceFile:242)
    at bb.h.a(SourceFile:239)
    at bb.i.handleMessage(SourceFile:129)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:145)
    at android.app.ActivityThread.main(ActivityThread.java:5942)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)

也是这样的:

java.lang.NullPointerException
        at miui.util.UiUtils.getMiuiUiVersion(UiUtils.java:100)
        at miui.util.UiUtils.isV5Ui(UiUtils.java:108)
        at android.view.Injector$ViewConfigurationHook.get(Injector.java:173)
        at android.view.ViewConfiguration.get(ViewConfiguration.java:336)
        at android.view.View.<init>(View.java:3453)
        at android.widget.ImageView.<init>(ImageView.java:114)
        at bb.h.b(SourceFile:301)
        at bb.h.a(SourceFile:242)
        at bb.h.a(SourceFile:239)
        at bb.i.handleMessage(SourceFile:129)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5050)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:805)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:621)
        at dalvik.system.NativeStart.main(Native Method)

NullPointerException都指向第301行。

ImageView iv = new ImageView(getActivity());

我已经考虑过这个错误了。也许活动是一个背景过程,不幸的是被回收了。然后我恢复它,片段找不到它的附加活动。所以我这样做:

if (savedInstanceState != null) {
            String FRAGMENTS_TAG = "android:support:fragments";
            // remove掉保存的Fragment
            savedInstanceState.remove(FRAGMENTS_TAG);
        }

并覆盖onSavedInstance活动方法:

@Override
        protected void onSaveInstanceState(Bundle outState) {

        }

但这无助,我仍然是Android的新手。请告诉我如何解决这个问题,非常感谢。

1 个答案:

答案 0 :(得分:0)

如果您可以将p中创建的代码放在p中,可能会有所帮助。但是,通过此链接link,您可以看到直接使用Fragment中的Activity可能会遇到同样的问题。希望这会有所帮助。

getActivity

此外,在调用getActivity()之前使用片段检查isAdded是一个很好的做法。当片段与活动分离时,这有助于避免空指针异常。例如,活动可能包含推送异步任务的片段。任务完成后,将调用onTaskComplete侦听器。

Fragment