2015-08-28 43 views
-4

正如標題所說,我在我的片段中創建了一個ImageView。如何解決getActivity()爲空,當我在片段中創建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 收集我的應用程序,這樣我就可以看到什麼caused.Here一些錯誤infomations:

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()); 

我已經想過這個error.Maybe該活動是研究背景的過程,不幸被recycled.Then我恢復了,碎片也找不到它的附activity.so我這樣做:

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

,並覆蓋onSavedInstance活動的方法:

@Override 
     protected void onSaveInstanceState(Bundle outState) { 

     } 

但是,這是無奈的,我仍然爲Android一個newbird。請告訴我如何解決這個問題,非常感謝。

+0

什麼是ImageView?這是來自你的XML的圖像? –

+0

你把方法放在哪裏:initBanner(String imgUrl)?在活動中? – Vigor

+0

不,在片段中。 – zienhern

回答

0

如果您可以將您創建Fragment的代碼放在Activity中可能會有幫助。但是從這個鏈接:link,您可以看到直接使用Fragment中的getActivity的相同問題。希望這會有所幫助。

if (savedInstanceState == null){  
     adapter.addFragment(new FirstFragment()); 
     adapter.addFragment(new SecondFragment()); 
    }else{ 
     Integer count = savedInstanceState.getInt("tabsCount"); 
     String[] titles = savedInstanceState.getStringArray("titles"); 
     for (int i = 0; i < count; i++){ 
      adapter.addFragment(getFragment(i), titles[i]); 
     } 
    } 

此外,在調用getActivity()之前使用片段檢查isAdded是一種很好的做法。這有助於避免片段與活動分離時出現空指針異常。例如,一個活動可能包含推送異步任務的片段。任務完成後,將調用onTaskComplete偵聽器。

@Override 
public void onTaskComplete(List<Feed> result) { 

    progress.setVisibility(View.GONE); 
    progress.setIndeterminate(false); 
    list.setVisibility(View.VISIBLE); 

    if (isAdded()) { 

     adapter = new FeedAdapter(getActivity(), R.layout.feed_item, result); 
     list.setAdapter(adapter); 
     adapter.notifyDataSetChanged(); 
    } 

} 
相關問題