From dc4a41088c01a365ab14d9ed5951f504c0fa3c12 Mon Sep 17 00:00:00 2001 From: Branden Archer Date: Sat, 21 May 2016 18:23:08 -0400 Subject: [PATCH] Generate barcode after ImageView size is known The size of the ImageView may not yet be known when the barcode generation is needed. If this is the case, wait until the final layout is complete then start the barcode generation. --- .../card_locker/LoyaltyCardViewActivity.java | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java index 3cf30d3ae..a11840d91 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java @@ -11,6 +11,7 @@ import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; +import android.view.ViewTreeObserver; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; @@ -149,7 +150,27 @@ public class LoyaltyCardViewActivity extends AppCompatActivity final BarcodeFormat format = BarcodeFormat.valueOf(formatString); final String cardIdString = cardIdField.getText().toString(); - new BarcodeImageWriterTask(barcodeImage, cardIdString, format).execute(); + if(barcodeImage.getHeight() == 0) + { + Log.d(TAG, "ImageView size is not known known at start, waiting for load"); + // The size of the ImageView is not yet available as it has not + // yet been drawn. Wait for it to be drawn so the size is available. + barcodeImage.getViewTreeObserver().addOnGlobalLayoutListener( + new ViewTreeObserver.OnGlobalLayoutListener() + { + @Override + public void onGlobalLayout() + { + Log.d(TAG, "ImageView size now known"); + new BarcodeImageWriterTask(barcodeImage, cardIdString, format).execute(); + } + }); + } + else + { + Log.d(TAG, "ImageView size known known, creating barcode"); + new BarcodeImageWriterTask(barcodeImage, cardIdString, format).execute(); + } barcodeIdLayout.setVisibility(View.VISIBLE); barcodeImageLayout.setVisibility(View.VISIBLE);