From 7bc02d960fd2aa880c4d89e45d243e37d09888a7 Mon Sep 17 00:00:00 2001 From: caijw Date: Fri, 24 Jun 2016 01:08:29 +0800 Subject: [PATCH] fixed crash on android 4.1 and padding issue --- .../android/bubbleview/BubbleFrameLayout.java | 7 +++++++ .../cpiz/android/bubbleview/BubbleImpl.java | 20 +++++++++++++++++-- .../bubbleview/BubbleLinearLayout.java | 7 +++++++ .../bubbleview/BubbleRelativeLayout.java | 7 +++++++ .../android/bubbleview/BubbleTextView.java | 7 +++++++ .../bubbleviewsample/MainActivity.java | 7 +++++++ 6 files changed, 53 insertions(+), 2 deletions(-) diff --git a/library/src/main/java/com/cpiz/android/bubbleview/BubbleFrameLayout.java b/library/src/main/java/com/cpiz/android/bubbleview/BubbleFrameLayout.java index 5fd8f04..108bf08 100644 --- a/library/src/main/java/com/cpiz/android/bubbleview/BubbleFrameLayout.java +++ b/library/src/main/java/com/cpiz/android/bubbleview/BubbleFrameLayout.java @@ -4,6 +4,7 @@ import android.content.Context; import android.os.Build; import android.util.AttributeSet; +import android.util.Log; import android.view.View; import android.widget.FrameLayout; @@ -177,6 +178,12 @@ public float getCornerBottomRightRadius() { @Override public void setPadding(int left, int top, int right, int bottom) { + if (mBubbleImpl == null) { + Log.w("BubbleView", "mBubbleImpl == null on old Android platform"); + setSuperPadding(left, top, right, bottom); + return; + } + mBubbleImpl.setPadding(left, top, right, bottom); } diff --git a/library/src/main/java/com/cpiz/android/bubbleview/BubbleImpl.java b/library/src/main/java/com/cpiz/android/bubbleview/BubbleImpl.java index 65da5b1..614e04b 100644 --- a/library/src/main/java/com/cpiz/android/bubbleview/BubbleImpl.java +++ b/library/src/main/java/com/cpiz/android/bubbleview/BubbleImpl.java @@ -7,6 +7,7 @@ import android.graphics.Rect; import android.os.Build; import android.util.AttributeSet; +import android.util.Log; import android.view.View; import java.lang.ref.WeakReference; @@ -60,7 +61,6 @@ public void init(View view, Context context, AttributeSet attrs) { mFillPadding = ta.getDimension(R.styleable.BubbleStyle_bb_fillPadding, 0); mBorderColor = ta.getColor(R.styleable.BubbleStyle_bb_borderColor, Color.WHITE); mBorderWidth = ta.getDimension(R.styleable.BubbleStyle_bb_borderWidth, 0); - ta.recycle(); } updateDrawable(mParentView.getWidth(), mParentView.getHeight(), false); @@ -266,6 +266,22 @@ public float getCornerBottomRightRadius() { @SuppressWarnings("SuspiciousNameCombination") @Override public void setPadding(int left, int top, int right, int bottom) { + if (mHolderCallback == null) { + return; + } + + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.JELLY_BEAN) { + StackTraceElement stack[] = (new Throwable()).getStackTrace(); + for (int i = 0; i < 7; i++) { + if (stack[i].getClassName().equals(View.class.getName()) + && stack[i].getMethodName().equals("recomputePadding")) { + Log.w("BubbleImpl", "Called setPadding by View on old Android platform"); + mHolderCallback.setSuperPadding(left, top, right, bottom); + return; + } + } + } + mPaddingLeftOffset = mPaddingTopOffset = mPaddingRightOffset = mPaddingBottomOffset = 0; switch (mArrowDirection) { case Left: @@ -348,7 +364,7 @@ protected void updateDrawable(int width, int height, boolean drawImmediately) { arrowToOffsetY = mRectTo.centerY() - mRectSelf.centerY(); mArrowDirection = getAutoArrowDirection(width, height, arrowToOffsetX, arrowToOffsetY, (int) mArrowHeight); } - mParentView.setPadding(mParentView.getPaddingLeft(), mParentView.getPaddingTop(), mParentView.getPaddingRight(), mParentView.getPaddingBottom()); + setPadding(mParentView.getPaddingLeft(), mParentView.getPaddingTop(), mParentView.getPaddingRight(), mParentView.getPaddingBottom()); if (drawImmediately) { mBubbleDrawable.resetRect(width, height); diff --git a/library/src/main/java/com/cpiz/android/bubbleview/BubbleLinearLayout.java b/library/src/main/java/com/cpiz/android/bubbleview/BubbleLinearLayout.java index 4c94258..ff47439 100644 --- a/library/src/main/java/com/cpiz/android/bubbleview/BubbleLinearLayout.java +++ b/library/src/main/java/com/cpiz/android/bubbleview/BubbleLinearLayout.java @@ -4,6 +4,7 @@ import android.content.Context; import android.os.Build; import android.util.AttributeSet; +import android.util.Log; import android.view.View; import android.widget.LinearLayout; @@ -177,6 +178,12 @@ public float getCornerBottomRightRadius() { @Override public void setPadding(int left, int top, int right, int bottom) { + if (mBubbleImpl == null) { + Log.w("BubbleView", "mBubbleImpl == null on old Android platform"); + setSuperPadding(left, top, right, bottom); + return; + } + mBubbleImpl.setPadding(left, top, right, bottom); } diff --git a/library/src/main/java/com/cpiz/android/bubbleview/BubbleRelativeLayout.java b/library/src/main/java/com/cpiz/android/bubbleview/BubbleRelativeLayout.java index 031204c..ad8cb55 100644 --- a/library/src/main/java/com/cpiz/android/bubbleview/BubbleRelativeLayout.java +++ b/library/src/main/java/com/cpiz/android/bubbleview/BubbleRelativeLayout.java @@ -4,6 +4,7 @@ import android.content.Context; import android.os.Build; import android.util.AttributeSet; +import android.util.Log; import android.view.View; import android.widget.RelativeLayout; @@ -177,6 +178,12 @@ public float getCornerBottomRightRadius() { @Override public void setPadding(int left, int top, int right, int bottom) { + if (mBubbleImpl == null) { + Log.w("BubbleView", "mBubbleImpl == null on old Android platform"); + setSuperPadding(left, top, right, bottom); + return; + } + mBubbleImpl.setPadding(left, top, right, bottom); } diff --git a/library/src/main/java/com/cpiz/android/bubbleview/BubbleTextView.java b/library/src/main/java/com/cpiz/android/bubbleview/BubbleTextView.java index 4a11d94..56e1fec 100644 --- a/library/src/main/java/com/cpiz/android/bubbleview/BubbleTextView.java +++ b/library/src/main/java/com/cpiz/android/bubbleview/BubbleTextView.java @@ -4,6 +4,7 @@ import android.content.Context; import android.os.Build; import android.util.AttributeSet; +import android.util.Log; import android.view.View; import android.widget.TextView; @@ -176,6 +177,12 @@ public float getCornerBottomRightRadius() { @Override public void setPadding(int left, int top, int right, int bottom) { + if (mBubbleImpl == null) { + Log.w("BubbleView", "mBubbleImpl == null on old Android platform"); + setSuperPadding(left, top, right, bottom); + return; + } + mBubbleImpl.setPadding(left, top, right, bottom); } diff --git a/sample/src/main/java/com/cpiz/android/bubbleviewsample/MainActivity.java b/sample/src/main/java/com/cpiz/android/bubbleviewsample/MainActivity.java index 3321b64..1349d4e 100644 --- a/sample/src/main/java/com/cpiz/android/bubbleviewsample/MainActivity.java +++ b/sample/src/main/java/com/cpiz/android/bubbleviewsample/MainActivity.java @@ -3,6 +3,8 @@ import android.os.Bundle; import android.support.v7.app.AppCompatActivity; +import com.cpiz.android.bubbleview.BubbleTextView; + public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; @@ -11,5 +13,10 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // setContentView(R.layout.activity_test); + + BubbleTextView bubbleTextView = (BubbleTextView) findViewById(R.id.bubble); + if (bubbleTextView != null) { + bubbleTextView.setPadding(50, 50, 50, 50); + } } }