IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

setAutoLinkMask et setLinksClickable


Sujet :

Android

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 13
    Par défaut setAutoLinkMask et setLinksClickable
    Bonjour,

    Je reviens vers vous suite à un souci que je ne parviens pas à résoudre seul.

    J'aimerais modifier les propriétés d'un TextView afin de rendre les liens qu'il contient visibles et/ou cliquables en passant par un système de préférences accessible à l'utilisateur. Au démarrage de l'application, ces propriétés sont toujours bien prises en compte quelque soit leurs configurations. Mais pendant l'utilisation de l'application, j'ai deux cas de figure.

    1 - Les liens ne se "désaffichent" plus (même en repassant la préférence à "false".)
    2 - Lorsque je définie les liens comme étant cliquables, le premier retour sur mon TextView ne le prend pas en compte alors que si je retourne dans les préférences et que j'en ressors sans rien faire, ils le deviennent. Par contre, ils le resteront ensuite quelque soit les modifications que j'apporterai jusqu'à fermeture et réouverture de l'application.

    J'ai testé des tas de solutions mais rien n'y fait.

    Je vous fournis les bouts de code nécessaires à la compréhension du problème (les variables sont bien déclarées et en les testant elles donnent bien les bonnes valeurs).

    Fonction de lancement de la partie "Préférence" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    @Override
    public boolean onOptionsItemSelected(MenuItem mnuItem) {
    	switch (mnuItem.getItemId()) {
    		case R.id.mnu_settings:
    			startActivity(new Intent(this, EditSettings.class));
    			return true;
    	}
    	return(super.onOptionsItemSelected(mnuItem));
    }
    La classe EditSettings ne fait rien de particulier à part afficher le fichier xml.

    Fonction de récupération des préférences : setSettingsApp() lancée dans onResume()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    SharedPreferences objSettings = PreferenceManager.getDefaultSharedPreferences(this);
     
    m_bSettingLinkMask = objSettings.getBoolean("set_cb_link_mask", false);
    m_iLinkify = 0;
    if (m_bSettingLinkMask) {
    	Boolean bLinkify = objSettings.getBoolean("set_cb_link_mask_web", true);
    	if (bLinkify) {
    		m_iLinkify = m_iLinkify + 1;
    	}
    	bLinkify = objSettings.getBoolean("set_cb_link_mask_email", true);
    	if (bLinkify) {
    		m_iLinkify = m_iLinkify + 2;
    	}
    	bLinkify = objSettings.getBoolean("set_cb_link_mask_phone", true);
    	if (bLinkify) {
    		m_iLinkify = m_iLinkify + 4;
    	}
    	bLinkify = objSettings.getBoolean("set_cb_link_mask_map", true);
    	if (bLinkify) {
    		m_iLinkify = m_iLinkify + 8;
    	}
    	txtView.setAutoLinkMask(m_iLinkify);
    	Linkify.addLinks(txtView, m_iLinkify);
    	txtView.setLinksClickable(objSettings.getBoolean("set_cb_link_mask_clickable", false));
    }
    else {
    	txtView.setAutoLinkMask(m_iLinkify);
    	Linkify.addLinks(txtView, m_iLinkify);
    	txtView.setLinksClickable(false);
    }
    Fichier settings.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    <PreferenceScreen	xmlns:android=	"http://schemas.android.com/apk/res/android">
    	<PreferenceCategory	android:title=	"@string/set_behavior">
    		<CheckBoxPreference	android:id=	"@+id/set_cb_link_mask"
    					android:key=	"set_cb_link_mask"
    					android:title=	"@string/set_cb_link_mask_title"
    					android:summary="@string/set_cb_link_mask_summary"
    					android:defaultValue="false" />
    		<CheckBoxPreference	android:id=	"@+id/set_cb_link_mask_web"
    					android:key=	"set_cb_link_mask_web"
    					android:title="@string/set_cb_link_mask_web_title"
    					android:dependency="set_cb_link_mask"
    					android:defaultValue="true" />
    		<CheckBoxPreference	android:id=	"@+id/set_cb_link_mask_phone"
    					android:key=	"set_cb_link_mask_phone"
    					android:title= "@string/set_cb_link_mask_phone_title"
    					android:dependency="set_cb_link_mask"
    					android:defaultValue="true" />
    		<CheckBoxPreference	android:id=	"@+id/set_cb_link_mask_map"
    					android:key=	"set_cb_link_mask_map"
    					android:title="@string/set_cb_link_mask_map_title"
    					android:dependency="set_cb_link_mask"
    					android:defaultValue="true" />
    		<CheckBoxPreference	android:id=	"@+id/set_cb_link_mask_email"
    					android:key=	"set_cb_link_mask_email"
    					android:title= "@string/set_cb_link_mask_email_title"
    					android:dependency="set_cb_link_mask"
    					android:defaultValue="true" />
    		<CheckBoxPreference	android:id=	"@+id/set_cb_link_mask_clickable"
    					android:key=	"set_cb_link_mask_clickable"
    					android:title= "@string/set_cb_link_mask_clickable_title"
    					android:summary= "@string/set_cb_link_mask_clickable_summary"
    					android:dependency="set_cb_link_mask"
    					android:defaultValue="false" />
    	</PreferenceCategory>
    </PreferenceScreen>
    Manifeste : Pour rendre l'appli disponible sur un maximum de plateformes, je fixe à 2 la version SDK mini.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <uses-sdk android:minSdkVersion="2" />
    Si vous avez besoin d'autre chose, n'hésitez pas à demander.

    Voilà, j'espère que vous pourrez mettre le doigt sur mon défaut de raisonnement parce que moi je suis dessus depuis deux jours et je n'avance pas.

    Cordialement.

  2. #2
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Par défaut
    Salut,

    J'ai pas lu tout le code ( ), mais la description de ton problème me fait penser à une sorte de "refresh" qu'il manque quelque part.
    As-tu essayer de forcer la redessin de tes composants impactés par la modification ?

    Bon courage.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 13
    Par défaut
    Merci pour ta réponse (méga rapide.) J'ai enfin pu avancer un peu. Y avait bien un souci de refresh que j'ai partiellement résolu et un autre de raisonnement que j'ai comblé.

    Voilà l'idée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    if (m_bSettingLinkMask) {
    	...
    	txtView.setAutoLinkMask(m_iLinkify);
    	Linkify.addLinks(txtView, m_iLinkify);
    	Boolean bClickable = objSettings.getBoolean("set_cb_link_mask_clickable", false);
    	txtView.setLinksClickable(bClickable);
    	if (bClickable) {
    		txtView.setMovementMethod(LinkMovementMethod.getInstance());
    	}
    	else {
    		txtView.setMovementMethod(ArrowKeyMovementMethod.getInstance());
    	}
    }
    else {
    	txtView.setAutoLinkMask(m_iLinkify);
    	Linkify.addLinks(txtView, m_iLinkify);
    	txtView.setLinksClickable(false);
    	txtView.setMovementMethod(ArrowKeyMovementMethod.getInstance());
    }
    String sTmp = txtView.getText().toString();
    txtView.setText("");
    txtView.setText(sTmp);
    setMovementMethod permet de récupérer la gestion du déplacement du curseur et la suppression des liens dans le texte. (Ca c'est pour l'erreur de raisonnement.)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String sTmp = txtView.getText().toString();
    txtView.setText("");
    txtView.setText(sTmp);
    Et voilà pour le refresh. Ca me plait moyen pour être franc. Je trouve que c'est du boulot de gougnafier mais bon, ça fonctionne. Je vais essayer de trouver une autre technique plus orthodoxe mais en attendant je te remercie. J'ai enfin réussi à donner à mon TextView le comportement souhaité.

  4. #4
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Par défaut
    ouais, c'est sur c'est pas un refresh du style auxquel je pensais, mais si ça fonctionne...

+ Répondre à la discussion
Cette discussion est résolue.

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo