2015-08-29 35 views
0

我試圖從Imageview中設置設備壁紙。我的代碼完全適用於運行Android 5.0或更高版本的設備,但出於某種原因,它不適用於4.4.4或更低版本。Android 4.4.4及以下的ImageView.getDrawingCache()null

我正在設置菜單項的壁紙。下面是代碼:

else if (id == R.id.action_quick_set) { 

    wallpaper_img_menu = (ImageView) findViewById(R.id.wallpaper_image); 

    wallpaper_img_menu.setDrawingCacheEnabled(true); 

    // this is the important code :) 
    // Without it the view will have a dimension of 0,0 and the bitmap will be null 
    wallpaper_img_menu.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), 
       View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); 
    wallpaper_img_menu.layout(0, 0, 
       wallpaper_img_menu.getMeasuredWidth(), 
       wallpaper_img_menu.getMeasuredHeight()); 

    wallpaper_img_menu.buildDrawingCache(true); 
    // This is what's null (line 807); everything else works fine 
    Bitmap b = Bitmap.createBitmap(wallpaper_img_menu.getDrawingCache()); 
    wallpaper_img_menu.setDrawingCacheEnabled(false); // clear drawing cache 

    try { 
     WallpaperManager.getInstance(getBaseContext()).setBitmap(b); 
     Toast.makeText(getBaseContext(), "Done!", Toast.LENGTH_SHORT).show(); 
     finish(); 
    } catch (IOException | NullPointerException e) { 
     e.printStackTrace(); 
    } 

} 

這裏的logcat的輸出:

08-29 19:34:57.025 25668-25668/com.hidden.hidden E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    java.lang.NullPointerException 
      at android.graphics.Bitmap.createBitmap(Bitmap.java:505) 
      at com.hidden.hidden.viewer.WallpaperViewer.onOptionsItemSelected(WallpaperViewer.java:807) 
      at android.app.Activity.onMenuItemSelected(Activity.java:2566) 
      at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:325) 
      at android.support.v7.app.AppCompatActivity.onMenuItemSelected(AppCompatActivity.java:147) 
      at android.support.v7.internal.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:100) 
      at android.support.v7.app.AppCompatDelegateImplV7.onMenuItemSelected(AppCompatDelegateImplV7.java:583) 
      at android.support.v7.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:811) 
      at android.support.v7.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:153) 
      at android.support.v7.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:958) 
      at android.support.v7.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:948) 
      at android.support.v7.internal.view.menu.MenuPopupHelper.onItemClick(MenuPopupHelper.java:191) 
      at android.widget.AdapterView.performItemClick(AdapterView.java:298) 
      at android.widget.AbsListView.performItemClick(AbsListView.java:1100) 
      at android.widget.AbsListView$PerformClick.run(AbsListView.java:2788) 
      at android.widget.AbsListView$1.run(AbsListView.java:3463) 
      at android.os.Handler.handleCallback(Handler.java:730) 
      at android.os.Handler.dispatchMessage(Handler.java:92) 
      at android.os.Looper.loop(Looper.java:137) 
      at android.app.ActivityThread.main(ActivityThread.java:5103) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:525) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
      at dalvik.system.NativeStart.main(Native Method) 

的代碼是從here.

我不明白的是爲什麼它的工作原理爲Android 5.0及以上,但沒有下面。

幫助感謝!

+0

之前'可繪製d = wallpaper_img_menu.getDrawable( )'然後在你喜歡的任何'Canvas'上繪製你的'Drawable' – pskink

+0

@pskink - 這個工程!作出回答,我會標記它。 –

回答

1

得到Drawable第一:

Drawable d = wallpaper_img_menu.getDrawable(); 

,然後繪製你的Drawable你喜歡的任何Canvas,請確保您所設定的範圍(d.setBounds(...))調用d.draw(canvas)

+0

感謝您的回答! –

+1

不客氣... – pskink