OSDN Git Service

Fix Wi-Fi QR code scanning icon disappears problem
authorArc Wang <arcwang@google.com>
Wed, 10 Apr 2019 03:46:49 +0000 (11:46 +0800)
committerArc Wang <arcwang@google.com>
Wed, 10 Apr 2019 06:20:11 +0000 (14:20 +0800)
Should not do one time initialization for the View in
Preference#onBindViewHolder. Because A view setup in
PreferenceViewHolder may be recycled.

Bug: 127502788
Test: manual
Change-Id: Iedf023fa00d2745a02521b65e5c12165c2bc025b

src/com/android/settings/wifi/AddWifiNetworkPreference.java
src/com/android/settings/wifi/tether/WifiTetherSsidPreference.java

index e49f2ab..03a80a4 100644 (file)
@@ -36,7 +36,7 @@ public class AddWifiNetworkPreference extends Preference {
 
     private static final String TAG = "AddWifiNetworkPreference";
 
-    private boolean mInitialized;
+    private final Drawable mScanIconDrawable;
 
     public AddWifiNetworkPreference(Context context) {
         super(context);
@@ -45,24 +45,22 @@ public class AddWifiNetworkPreference extends Preference {
         setWidgetLayoutResource(R.layout.wifi_button_preference_widget);
         setIcon(R.drawable.ic_menu_add);
         setTitle(R.string.wifi_add_network);
+
+        mScanIconDrawable = getDrawable(R.drawable.ic_scan_24dp);
     }
 
     @Override
     public void onBindViewHolder(PreferenceViewHolder holder) {
         super.onBindViewHolder(holder);
 
-        if (!mInitialized) {
-            mInitialized = true;
-
-            final ImageButton imageButton = (ImageButton) holder.findViewById(R.id.button_icon);
-            imageButton.setImageDrawable(getDrawable(R.drawable.ic_scan_24dp));
-            imageButton.setContentDescription(
-                    getContext().getString(R.string.wifi_dpp_scan_qr_code));
-            imageButton.setOnClickListener(view -> {
-                getContext().startActivity(
-                    WifiDppUtils.getEnrolleeQrCodeScannerIntent(/* ssid */ null));
-            });
-        }
+        final ImageButton scanButton = (ImageButton) holder.findViewById(R.id.button_icon);
+        scanButton.setImageDrawable(mScanIconDrawable);
+        scanButton.setContentDescription(
+                getContext().getString(R.string.wifi_dpp_scan_qr_code));
+        scanButton.setOnClickListener(view -> {
+            getContext().startActivity(
+                WifiDppUtils.getEnrolleeQrCodeScannerIntent(/* ssid */ null));
+        });
     }
 
     private Drawable getDrawable(@DrawableRes int iconResId) {
index 7d4ebec..4343fcc 100644 (file)
@@ -37,9 +37,7 @@ import com.android.settings.widget.ValidatedEditTextPreference;
 public class WifiTetherSsidPreference extends ValidatedEditTextPreference {
     private static final String TAG = "WifiTetherSsidPreference";
 
-    private ImageButton mImageButton;
-    private Drawable mButtonIcon;
-    private View mDivider;
+    private Drawable mShareIconDrawable;
     private View.OnClickListener mClickListener;
     private boolean mVisible;
 
@@ -72,30 +70,29 @@ public class WifiTetherSsidPreference extends ValidatedEditTextPreference {
         // TODO(b/129019971): use methods of divider line in parent object
         setLayoutResource(com.android.settingslib.R.layout.preference_two_target);
         setWidgetLayoutResource(R.layout.wifi_button_preference_widget);
+
+        mShareIconDrawable = getDrawable(R.drawable.ic_qrcode_24dp);
     }
 
     @Override
     public void onBindViewHolder(PreferenceViewHolder holder) {
         super.onBindViewHolder(holder);
 
-        if (mImageButton == null) {
-            mImageButton = (ImageButton) holder.findViewById(R.id.button_icon);
+        final ImageButton shareButton = (ImageButton) holder.findViewById(R.id.button_icon);
+        final View dividerView = holder.findViewById(R.id.two_target_divider);
 
-            mImageButton.setContentDescription(
+        if (mVisible) {
+            shareButton.setOnClickListener(mClickListener);
+            shareButton.setVisibility(View.VISIBLE);
+            shareButton.setContentDescription(
                     getContext().getString(R.string.wifi_dpp_share_hotspot));
-            setButtonIcon(R.drawable.ic_qrcode_24dp);
-            mImageButton.setImageDrawable(mButtonIcon);
-
-            mDivider = holder.findViewById(R.id.two_target_divider);
-        }
+            shareButton.setImageDrawable(mShareIconDrawable);
 
-        if (mVisible) {
-            mImageButton.setOnClickListener(mClickListener);
-            mImageButton.setVisibility(View.VISIBLE);
-            mDivider.setVisibility(View.VISIBLE);
+            dividerView.setVisibility(View.VISIBLE);
         } else {
-            mImageButton.setVisibility(View.GONE);
-            mDivider.setVisibility(View.GONE);
+            shareButton.setVisibility(View.GONE);
+
+            dividerView.setVisibility(View.GONE);
         }
     }
 
@@ -107,12 +104,15 @@ public class WifiTetherSsidPreference extends ValidatedEditTextPreference {
         mVisible = visible;
     }
 
-    private void setButtonIcon(@DrawableRes int iconResId) {
+    private Drawable getDrawable(@DrawableRes int iconResId) {
+        Drawable buttonIcon = null;
+
         try {
-            mButtonIcon = getContext().getDrawable(iconResId);
+            buttonIcon = getContext().getDrawable(iconResId);
         } catch (Resources.NotFoundException exception) {
             Log.e(TAG, "Resource does not exist: " + iconResId);
         }
+        return buttonIcon;
     }
 
     @VisibleForTesting