2014-06-20 2 views
1

J'ai un champ de texte d'édition. Modifier le texte a créé avec un symbole invisible, par exemple «#» - symbole invisible. Lorsque l'utilisateur clique sur EditText, il affiche des lettres minuscules sur le clavier virtuel.Touche programmable Android activer le verrouillage des majuscules après le symbole

Je veux que, après le symbole invisible, les premières lettres majuscules et le reste d'entre eux petites sur le clavier.

Comment cela peut-il être fait?

+1

texte 'Edit a créé avec symbol' invisible ce qu'il vouloir dire par? –

+0

Je pense qu'il initialise # à la première lettre. pourquoi ne peux-tu pas ajouter # dynamiquement quand tu prends la valeur en java side ?? – Jithu

+0

shylendra, EditText mEditText = (EditText) findViewById (...); mEditText.setText ('#'); Et l'utilisateur peut entrer seulement après ce symbole. Jithu, Parce que # est le nouveau symbole du nouveau paragraphe. Il faut corriger applySpans Paragraphe – Dima

Répondre

2

Enfin, je fonde la solution. J'ai résolu ce problème via InputType. C'est mauvais, mais rien de mieux que je n'ai pas trouvé. Dans CustomEditText vous devez remplacer la méthode OnSelectionChanged et changer InputType il:

public boolean isWasCap = false;// Was capitalisation turn on? 

public void onSelectionChanged(int selStart, int selEnd) { 
    ... 

    setCap(); 
} 

/** 
* Method check is need turn on capitalization 
*/ 
private void setCap(){ 
    int start = getSelectionStart(); 
    int end = getSelectionEnd(); 
    if (start == end && start > 0 
      && getText().charAt(start-1) == INVISIBLE_SYMBOL) { 
     if(isWasCap) // Capitalization is turn on 
      return; 
     setInputMask(InputType.TYPE_TEXT_FLAG_CAP_SENTENCES, InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS); 
     isWasCap = true; 
    }else if(isWasCap){ 
     isWasCap = false; 
     setInputMask(InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS, InputType.TYPE_TEXT_FLAG_CAP_SENTENCES); 
    } 
} 

/** 
* Method replace one input type to other input type 
* @param needRemove - mask which will remove 
* @param needSetup - masr which will setup 
*/ 
public void setInputMask(int needRemove, int needSetup){ 
    int mask = getInputType() & ~needRemove; 
    mask = mask | needSetup; 
    setInputType(mask); 
} 

style.xml

<style name="Common.Editor"> 

    <item name="android:inputType">textCapSentences|textMultiLine|textAutoCorrect</item> 
</style> 

main_activity.xml

<com.view.CustomEditText 
     android:id="@+id/edit_text" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     style="@style/Common.Editor" 
     /> 
+0

Super! Exactement ce dont j'avais besoin et fonctionne comme un charme. Cependant, j'ai beaucoup simplifié le code: int inputType = getInputType(); \t \t \t if (selStart <= 1) { \t \t \t setInputType (InputType | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS); \t \t \t} else { \t \t \t setInputType (InputType & ~ InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS); \t \t \t} – Ridcully

+0

@Ridcully Je dois vous avertir que ce résoudre haves quelques défauts: 1) Si le texte d'entrée utilisateur en balayant l'écran, tout le texte qui sera collé à EditTtext sera Witten avec en capital ces deux États. Il a besoin de surveillance à l'intérieur de TextWatcher. 2) Le mot qui sera entré fonctionnera différemment dans la saisie semi-automatique sur différents appareils. On ne remplira pas automatiquement ce mot, un autre complétera automatiquement le mot sans d'abord plus tard, un autre complètera automatiquement. – Dima

+0

Merci pour l'avertissement. Comment avez-vous implémenté TextWatcher alors? Est-ce la raison pour laquelle vous avez la variable isWasCap? – Ridcully

0

simplement Définissez android:inputType="textCapSentences" sur votre EditText.

OU

android:inputType="textCapWords" 
+0

Je pense, il est en train d'initialiser # à la première lettre. Donc, cela peut ne pas fonctionner. – Jithu

Questions connexes