Personnalisation de CheckBoxPreference via Android: widgetLayout

J'ai une Preference qui permet un adaptateur de synchronisation, et prend un certain temps pour faire son travail lorsqu'il est basculé. Par conséquent, lorsque l'utilisateur clique sur la Preference , je tourne une AsyncTask pour effectuer le travail. En attendant, je désactive la Preference et remplace la case à cocher par un ProgressBar indéterminé. J'ai tout cela fonctionnant via un hack impliquant une sous-classe de CheckBoxPreference qui recouvre le ProgressBar en haut de la CheckBox . Yuck.

L' android:widgetLayout attribut semble être conçu exactement pour cela. Je devrais pouvoir utiliser android:widgetLayout pour spécifier un remplacement de CheckBox par défaut. Ce remplacement impliquerait Checkable et utiliserait ViewSwitcher pour basculer correctement entre CheckBox et ProgressBar .

  • Android: utilisez Picasso pour charger l'image sans la stocker dans le cache
  • Barre d'action pour Android 2.1
  • Exception de casting de classe lors du changement d'orientation (Android)
  • Obtenir une chaîne Spannable à partir de EditText
  • Comment obtenir le fichier .apk d'une application par programme
  • Dois-je afficher la licence apache dans mon application lors de l'utilisation de phonegap?
  • Le seul problème est que CheckBoxPreference , dans sa méthode onBindView() , semble ignorer la possibilité que android:widgetLayout puisse être utilisé. Cela fait explicitement ceci:

     View checkboxView = view.findViewById(com.android.internal.R.id.checkbox); 

    Cela rend effectivement impossible d'échanger dans un Checkable personnalisé via android:widgetLayout et le faire fonctionner réellement.

    Est-ce un problème de surveillance / bug dans CheckBoxPreference , ou ai-je mal compris android:widgetLayout ? Existe-t-il un moyen plus propre de faire ce que j'essaie de faire?

  • Android - Tout ce qui ressemble à l'iPhone SDK délègue les retours de rappel?
  • Bitbucket avec Android: erreur "Impossible de publier une partie de dépôt"
  • Comment puis-je passer des valeurs entre les activités sur Android?
  • RXJava - permet d'observer une pause (avec tampon et fenêtre par exemple)
  • Supprimez l'arrière-plan dessiné par programme dans Android
  • Comment ajouter un effet ondulé aux préférences dans Android?
  • 2 Solutions collect form web for “Personnalisation de CheckBoxPreference via Android: widgetLayout”

    1. Tout d'abord, je suis d'accord avec vous que Android devrait refactoriser la pièce de code view.findViewById(com.android.internal.R.id.checkbox); Pour «appeler une méthode protégée» qui peut être surchargé par la sous-classe.

    2. Heureusement, nous sommes toujours en mesure d'annuler le travail comme suit: L'idée est simple: déclarer une case à cocher qui a un identifiant id android @android:id/checkbox

    <CheckBoxPreference
    android:key="autostart"
    android:widgetLayout="@layout/customlayout" />

    Et dans customlayout.xml:

    <SwitchView>
    ...
    <CheckBox>

    Android: id = " @android: id / checkbox "
    Android: layout_width = "wrap_content"
    Android: layout_height = "wrap_content"
    Android: text = "mycheck"
    Android: clickable = "false"
    Android: focusable = "false"
    Android: focusableInTouchMode = "false"
    </CheckBox>

    Il est très important de noter que les attributs de la case à cocher définissables doivent être définis sur false (je suppose que la mise en page par défaut de CheckBoxPreference fait la même chose) afin que la liste apdater reçoive l'événement plutôt que la case à cocher elle-même. Je suppose que vous n'avez pas réussi dans votre essai simplement parce que vous n'avez pas fixé l'état focalisable.

    Greensuisse
    (https://sites.google.com/site/greensuisse/)

    Android: widgetLayout est la bonne partie de la préférence. Dans CheckBoxPreference, widgetLayout est la case à cocher. Si vous prenez une base de préférence et mettez un ViewSwitcher dans widgetLayout, cela devrait fonctionner

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.