Gibt es eine maximale Bitmap-Größe bei Verwendung von getDrawingCache?
Ich versuche, eine Bitmap des Texts in einem @ zu erstelleTextView
. In der Vergangenheit habe ich dies mit @ gemacgetDrawingCache
. Jetzt muss ich jedoch eine Bitmap eines @ erstelleTextView
mit viel längerem Text als zuvor. Dies verursachtgetDrawingCache
, um eine NullPointerException auszulösen.
Obwohl ich "viel längeren Text" sage, spreche ich nicht über unangemessen lange. Wenn ich eine Textansicht mit einer Breite von 600 Pixel und einer Schriftgröße von 24 erstelle, wird die Ausnahme bei 53 Textzeilen (nicht jedoch bei 52 Zeilen) angezeigt. Gibt es eine Problemumgehung dafür?
uerst dachte ichdiese Antwort, in dem sich das Layout auf ein @ stütcanvas
, war die Lösung. Das hat jedoch bei mir nicht funktioniert, da ich die TextView programmgesteuert erstelle unddie Breite und Höhe sind 0 bevor sie ausgelegt werden. Ich gestalte mein @ nie wirkliTextView
auf dem Bildschirm
private Bitmap getBitmap(Context context){
final int NUMBER_OF_LINES = 53; // 53 crashes, 52 doesn't
final int width = 600; // width of TextView in pixels
final int fontSize = 24;
// create string with NUMBER_OF_LINES
StringBuilder testString = new StringBuilder();
for (int i = 0; i < NUMBER_OF_LINES; i++) {
testString.append("\n");
}
// Create TextView
TextView tvText = new TextView(context);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
tvText.setTextSize(fontSize);
tvText.setWidth(width);
tvText.setLayoutParams(params);
tvText.setBackgroundColor(Color.WHITE); // even setting the background color affects crashing or not
tvText.setText(testString);
// Create bitmap
tvText.setDrawingCacheEnabled(true);
tvText.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
tvText.layout(0, 0, tvText.getMeasuredWidth(), tvText.getMeasuredHeight());
tvText.buildDrawingCache(true);
Bitmap bitmap = Bitmap.createBitmap(tvText.getDrawingCache()); // crashes here
tvText.setDrawingCacheEnabled(false);
// This also didn't work because width and height are 0
/*Bitmap bitmap = Bitmap.createBitmap(tvText.getWidth(), tvText.getHeight(),
Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
tvText.draw(canvas);*/
return bitmap;
}
NullPointerException06-21 14:20:24.628 8036-8036/com.example.testsomecode E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.testsomecode/com.example.testsomecode.MainActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2092)
...
Caused by: java.lang.NullPointerException
at android.graphics.Bitmap.createBitmap(Bitmap.java:494)
at com.example.testsomecode.MainActivity.getBitmap(MainActivity.java:57) // -> Bitmap bitmap = Bitmap.createBitmap(tvText.getDrawingCache());
at com.example.testsomecode.MainActivity.onCreate(MainActivity.java:25)
...
HinweiDies ist keine IllegalArgumentException oder OutOfMemoryError (Zumindest nicht extern, obwohl dies möglicherweise der interne Grund ist.)
Mysterious Stacktrace in der Android-Entwicklerkonsole (Bitmap-Größe übersteigt 32 Bit)Strange out of memory issue beim Laden eines Bildes in ein Bitmap-Objekt