summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaurice Lam <yukl@google.com>2016-05-20 19:21:12 -0700
committerMaurice Lam <yukl@google.com>2016-05-23 12:13:07 -0700
commita8e0755e1b526174fe42b0d7215d3c6a6106aca2 (patch)
treed6ea566facf405933899b4d67cba76ba1f3b6784
parentb58dc454fc20cf88edd7feba247d62c67bc920a1 (diff)
downloadsetupwizard-a8e0755e1b526174fe42b0d7215d3c6a6106aca2.tar.gz
[SuwLib] Remove button from parent after createButton
Since the button for a ButtonItem is reused, it may be moved to a different view parent after re-binding. In order to make sure the move is successful, the button must be first removed from the current parent before returning. Bug: 28317915 Change-Id: Ice2a7d1a5f33870775dfd26c1bff816de70526e9
-rw-r--r--library/main/src/com/android/setupwizardlib/items/ButtonItem.java13
-rw-r--r--library/test/src/com/android/setupwizardlib/test/ButtonItemTest.java13
2 files changed, 26 insertions, 0 deletions
diff --git a/library/main/src/com/android/setupwizardlib/items/ButtonItem.java b/library/main/src/com/android/setupwizardlib/items/ButtonItem.java
index 4faeff4..2ec6489 100644
--- a/library/main/src/com/android/setupwizardlib/items/ButtonItem.java
+++ b/library/main/src/com/android/setupwizardlib/items/ButtonItem.java
@@ -114,6 +114,13 @@ public class ButtonItem extends AbstractItem implements View.OnClickListener {
throw new UnsupportedOperationException("Cannot bind to ButtonItem's view");
}
+ /**
+ * Create a button according to this button item.
+ *
+ * @param parent The parent of the button, used to retrieve the theme and context for this
+ * button.
+ * @return A button that can be added to the parent.
+ */
protected Button createButton(ViewGroup parent) {
if (mButton == null) {
Context context = parent.getContext();
@@ -122,6 +129,12 @@ public class ButtonItem extends AbstractItem implements View.OnClickListener {
}
mButton = new Button(context);
mButton.setOnClickListener(this);
+ } else {
+ if (mButton.getParent() instanceof ViewGroup) {
+ // A view cannot be added to a different parent if one already exists. Remove this
+ // button from its parent before returning.
+ ((ViewGroup) mButton.getParent()).removeView(mButton);
+ }
}
mButton.setEnabled(mEnabled);
mButton.setText(mText);
diff --git a/library/test/src/com/android/setupwizardlib/test/ButtonItemTest.java b/library/test/src/com/android/setupwizardlib/test/ButtonItemTest.java
index 45342d0..3490d4d 100644
--- a/library/test/src/com/android/setupwizardlib/test/ButtonItemTest.java
+++ b/library/test/src/com/android/setupwizardlib/test/ButtonItemTest.java
@@ -21,6 +21,7 @@ import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
+import android.widget.FrameLayout;
import android.widget.LinearLayout;
import com.android.setupwizardlib.R;
@@ -66,6 +67,18 @@ public class ButtonItemTest extends AndroidTestCase {
assertTrue("Default button text should be empty", TextUtils.isEmpty(button.getText()));
}
+ public void testCreateButtonTwice() {
+ TestButtonItem item = new TestButtonItem();
+ final Button button = item.createButton(mParent);
+
+ FrameLayout frameLayout = new FrameLayout(getContext());
+ frameLayout.addView(button);
+
+ final Button button2 = item.createButton(mParent);
+ assertSame("createButton should be reused", button, button2);
+ assertNull("Should be removed from parent after createButton", button2.getParent());
+ }
+
public void testSetEnabledTrue() {
TestButtonItem item = new TestButtonItem();
item.setEnabled(true);