6

Sadece bir MultiSelectListPreference ile dizi kaynaklarındaki girdileri, değerleri ve varsayılan değerleri ile bir SettingsActivity verildiğinde, Android onaylı olsa bile bazı onay kutuları işaretli olarak çizilmez. kontrol edilmesi gerekiyordu. İşaretlenmemiş bir öğe tıklandığında, öğe işaretlenmemiş olarak kalır (çünkü Android, işaretli bir öğenin işaretini kaldırdığını düşünür). burada mevcutMultiSelectListPreference onay kutuları, listede başlangıçta görülemediğinde işaretlenmiyor (API 23)

Here's a video of this happening

Proje: https://github.com/ImmersibleElf/MSLPBug

API'ler 21 ve 22 iyi çalışır gibi görünüyor, ama görüşlerin geri dönüşümü bu belki bir hata değil 23'te mi? Ya da neden olabilir?

SettingsActivity.java

package com.immersibleelf.mslpbug; 

import android.os.Bundle; 
import android.preference.PreferenceFragment; 
import android.support.v7.app.AppCompatActivity; 

public class SettingsActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // Display the fragment as the main content. 
     getFragmentManager().beginTransaction() 
       .replace(android.R.id.content, new SettingsFragment()) 
       .commit(); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
    } 

    public static class SettingsFragment extends PreferenceFragment { 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

      // Load the settings from an XML resource 
      addPreferencesFromResource(R.xml.settings); 
     } 
    } 
} 

settings.xml

<?xml version="1.0" encoding="utf-8"?> 

<PreferenceScreen 
    xmlns:android="http://schemas.android.com/apk/res/android"> 

     <MultiSelectListPreference 
      android:key="mslp_key" 
      android:title="MultiSelectListPreference" 
      android:entries="@array/mslp_entries" 
      android:entryValues="@array/mslp_entry_values" 
      android:defaultValue="@array/mslp_default_value" 
      android:persistent="true" 
      /> 
</PreferenceScreen> 

arrays.xml

bir çözüm MultiSelectListPreference bir alt sınıfı oluşturmak ve gibi showDialog yöntemi üzerine için
<?xml version="1.0" encoding="utf-8"?> 

<resources> 

    <string-array name="mslp_entries"> 
     <item>Entry 01</item> 
     <item>Entry 02</item> 
     <item>Entry 03</item> 
     <item>Entry 04</item> 
     <item>Entry 05</item> 
     <item>Entry 06</item> 
     <item>Entry 07</item> 
     <item>Entry 08</item> 
     <item>Entry 09</item> 
     <item>Entry 10</item> 
     <item>Entry 11</item> 
     <item>Entry 12</item> 
     <item>Entry 13</item> 
     <item>Entry 14</item> 
     <item>Entry 15</item> 
    </string-array> 

    <string-array name="mslp_entry_values"> 
     <item>1</item> 
     <item>2</item> 
     <item>3</item> 
     <item>4</item> 
     <item>5</item> 
     <item>6</item> 
     <item>7</item> 
     <item>8</item> 
     <item>9</item> 
     <item>10</item> 
     <item>11</item> 
     <item>12</item> 
     <item>13</item> 
     <item>14</item> 
     <item>15</item> 
    </string-array> 

    <string-array name="mslp_default_value"> 
     <item>1</item> 
     <item>2</item> 
     <item>3</item> 
     <item>4</item> 
     <item>5</item> 
     <item>6</item> 
     <item>7</item> 
     <item>8</item> 
     <item>9</item> 
     <item>10</item> 
     <item>11</item> 
     <item>12</item> 
     <item>13</item> 
     <item>14</item> 
     <item>15</item> 
    </string-array> 

</resources> 
+0

aynı sorunu yaşıyorsunuz rastgele – Xan

+0

işaretini eleman kaydırma yaparken daha eleman varsa, geri dönüşüm üzerine bir android hatadır. Daha fazla bilgi veya olası bir düzeltme buldunuz mu? – mdiener

+1

@mdiener Ben [burada bildirildi] (https://code.google.com/p/android/issues/detail?id=205487) ama bunun oldukça düşük öncelikli bir hata olduğunu hayal ediyorum. Kendim izlemeye çalıştım, ancak şu ana kadar Windows PC'lerimde şu ana kadar izleyebiliyordum. Linux veya Mac işletim sisteminiz varsa ve Android kaynağı ile uğraşmak istiyorsanız, sizi sorunlu alanlara yönlendirebilirim. Ama tam olarak neyin yanlış gittiğini bile bilmenin kesin bir düzeltmeye yol açmayacağı. – Chroaster

cevap

4

bu:

+1

"CheckedTextView" için iki döküm gereksiz. Bunun dışında, bu mükemmel, çok teşekkürler. – Keelan

0

Mükemmel. mdiener belirtildiği gibi bu kod çalışır: bence

import android.app.AlertDialog; 
import android.content.Context; 
import android.os.Build; 
import android.os.Bundle; 
import android.preference.MultiSelectListPreference; 
import android.util.AttributeSet; 
import android.view.View; 
import android.widget.AbsListView; 
import android.widget.CheckedTextView; 
import android.widget.ListView; 

/** 
* Android bug: https://code.google.com/p/android/issues/detail?id=205487 
*/ 
public class MultiSelectWrapper extends MultiSelectListPreference { 

public MultiSelectWrapper(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
    super(context, attrs, defStyleAttr, defStyleRes); 
} 

public MultiSelectWrapper(Context context, AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 
} 

public MultiSelectWrapper(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public MultiSelectWrapper(Context context) { 
    super(context); 
} 

@Override 
protected void showDialog(Bundle state) { 
    super.showDialog(state); 

    AlertDialog dialog = (AlertDialog)getDialog(); 
    if (dialog == null) 
     return; 

    if (Build.VERSION.SDK_INT >= 23) { 
     ListView listView = dialog.getListView(); 

     listView.setOnScrollListener(new AbsListView.OnScrollListener() { 
      @Override 
      public void onScrollStateChanged(AbsListView view, int scrollState) { 
       int size = view.getChildCount(); 
       for (int i=0; i<size; i++) { 
        View v = view.getChildAt(i); 
        if (v instanceof CheckedTextView) 
         ((CheckedTextView)v).refreshDrawableState(); 
       } 
      } 

      @Override 
      public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
       int size = view.getChildCount(); 
       for (int i=0; i<size; i++) { 
        View v = view.getChildAt(i); 
        if (v instanceof CheckedTextView) 
         ((CheckedTextView)v).refreshDrawableState(); 
       } 
      } 
     }); 
    } 
} 
}