9

Sto lavorando per aggiungere l'effetto di ripple quando si tocca la preferenza (selezionata). Ho personalizzato la mia preferenza estendendo il numero ListPreference. Ho provato a impostare l'effetto a catena programmaticamente utilizzando RippleDrawable ma non vedo l'animazione.Come aggiungere l'effetto a catena alle preferenze in Android?

Ecco il mio personalizzato preferenza

public class CustomListPreference extends ListPreference { 

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

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

     @Override 
     protected void onBindView(View view) { 
      super.onBindView(view); 
      setCustomStyle(view); 
     } 

     private void setCustomStyle(View view) { 
      TextView titleView = (TextView) view.findViewById(android.R.id.title); 
      titleView.setTypeface(InitActivity.TYPEFACE_REGULAR); 
      TextView summary = (TextView) view.findViewById(android.R.id.summary); 
      summary.setTypeface(InitActivity.TYPEFACE_REGULAR); 

      //Setting the drawable here, but it doesn't work.   
      RippleDrawable drawable = (RippleDrawable) getContext().getResources().getDrawable(R.drawable.my_ripple_background); 
      view.setBackGround(drawable); 
     } 

} 

Le mie preferenze di layout

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

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 
    <!-- opens a subscreen of settings --> 
    <com.abc.app.CustomListPreference 
      android:defaultValue="1" 
      android:entries="@array/sampleEntries" 
      android:entryValues="@array/SampleEntryValues" 
      android:key="some_preference" 
      android:title="@string/some_preferences" /> 

    <com.abc.app.CustomCheckboxPreference 
      android... /> 


</PreferenceScreen> 

mio ondulazione xml

<ripple 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:color="@color/light_black_overlay"> <!--#22000000--> 
    <item> 
     <shape 
      android:shape="rectangle"> 
      <solid android:color="@android:color/background_light" /> 
     </shape> 
    </item> 
</ripple> 

Perchè sono impostando l'animazione per la corretta visione? Qualsiasi idea è apprezzata. Grazie.

risposta

6

Questo è un esempio completo minimo per aggiungere un effetto di ripple personalizzato a una classe che estende ListPreference. Ho appena fatto e testato questo con API 21 (5.0).

SettingsActivity (lancio di attività)

public class SettingsActivity extends PreferenceActivity { 

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

     addPreferencesFromResource(R.xml.pref_general); 
    } 
} 

pref_general.xml

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

    <CheckBoxPreference 
     android:defaultValue="true" 
     android:key="example_checkbox" 
     android:summary="a checkbox" 
     android:title="Checkbox test" /> 

    <!-- replace with com.abc.app.CustomListPreference in your case--> 
    <com.timcastelijns.rippletest.CustomListPreference 
     android:defaultValue="1" 
     android:entries="@array/sampleEntries" 
     android:entryValues="@array/SampleEntryValues" 
     android:key="some_preference" 
     android:title="test" /> 

</PreferenceScreen> 

arrays.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <string-array name="sampleEntries"> 
     <item>1</item> 
     <item>2</item> 
     <item>3</item> 
    </string-array> 

    <string-array name="SampleEntryValues"> 
     <item>4</item> 
     <item>5</item> 
     <item>6</item> 
    </string-array> 
</resources> 

CustomListPreference

public class CustomListPreference extends ListPreference { 

    private Context ctx; 

    public CustomListPreference(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     ctx = context; 
    } 

    public CustomListPreference(Context context) { 
     super(context); 
     ctx = context; 
    } 

    @Override 
    protected void onBindView(View view) { 
     super.onBindView(view); 
     setCustomStyle(view); 
    } 

    private void setCustomStyle(View view) { 
     RippleDrawable drawable = (RippleDrawable) ctx.getDrawable(R.drawable.my_ripple_background); 
     view.setBackground(drawable); 
    } 
} 

my_ripple_background.xml

<?xml version="1.0" encoding="utf-8"?> 
<ripple xmlns:android="http://schemas.android.com/apk/res/android" 
    android:color="@android:color/holo_blue_light"> 
    <item android:id="@android:id/mask"> 
     <color android:color="@android:color/white" /> 
    </item> 
</ripple> 

Quando premuto, mostra una luce blu effetto a catena, come specificato nel xml:

enter image description here


Ho creato questo esempio in base al codice e al codice dell'esempio SettingsActivity negli esempi dell'SDK Android.


Edit:
Dopo un po 'di tempo in chat e che provano varie cose, siamo venuti alla conclusione che il problema è causato dal telefono di OP (Samsung S5) o è impostazioni. Quando OP ha provato il codice nell'emulatore, tutto ha funzionato correttamente.

Per riferimento - come appariva nel PO telefono:

enter image description here

+0

ho accidentalmente aggiunto estensione del file .xml nel mio codice. Penso di aver eseguito il mio codice senza l'estensione del file. Proverò altri frammenti però. – Prudhvi

+0

Ho provato il tuo codice, ho potuto vedere lo sfondo colorato blu al tatto ma non è come un'increspatura.Un'ondulazione dovrebbe espandersi dal punto di tocco ai modi laterali della vista. – Prudhvi

+0

@prudhvi lo fa esattamente per me però. Che sdk stai usando? Potresti includere un po 'del tuo codice in modo da poterlo verificare? Soprattutto il tuo ripple xml –