2015-04-12 68 views
0

我需要自动大写化合物名称中的首字母,例如:Gay-Lussac(法国物理学家),Иванов-Вано(俄罗斯动画导演)。自动大写化合物名称中的第一个字母(EditText,Android)

Android EditText仅首字母大写全名,我得到了Gay-lussac和Иванов-вано。

有什么方法吗?

我的EditText是

 <EditText 
      android:id="@+id/nameET" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="31dp" 
      android:hint="@string/hint_name" 
      android:imeOptions="actionNext" 
      android:inputType="textCapWords|textCapSentences|textPersonName" 
      android:singleLine="true" /> 

我也试过(也不会为第二部分工作):

 <EditText 
      ... 
      android:capitalize="words" 
      android:singleLine="true" /> 

 <EditText 
      ... 
      android:capitalize="words" 
      android:inputType="textCapWords|textCapSentences" 
      android:singleLine="true" /> 
+0

@LieRyan我不确定。 ' - '字符后,我需要把名字的第二部分大写。建议的解决方案只能在首字母,空格之后或字段开始处大写。我做错了什么? – tse

回答

0

你可以在2个步骤进行操作:

- 在strings.xml中将字符串分隔为(即:"Gay - Lussac"),并让Android对其进行大写处理。
- 然后用Java替换" - ""-"

[编辑]

如果输入是从该用户,然后更换步骤步骤:

- 首先,代替用户输入字符串:"-"" - "

+0

我不知道所有可能的化合物名称,它只是样品。 strings.xml无法帮助。或者我误解了你的想法。 – tse

+0

你从哪里取名?它们不存储在strings.xml中吗?它们是否存储在数据库中? –

+0

我从用户输入名称。它是EditText,而不是TextView! – tse

0

您应该创建一个包含如下静态方法的类:

public static CharSequence capitalize(CharSequence name){ 

    if(name == null) return null; 

    String sName = name.toString().toLowerCase().trim(); 
    String result = ""; 

    sName = capFirst(sName); 

    if(sName.contains("-")){ 

     result = ""; 
     String[] subParts = sName.split("-"); 

     for(int i = 0; i < subParts.length; i++){ 

      String subPart = subParts[i]; 
      result += capFirst(subPart); 
      if(i < subParts.length - 1) result += "-"; 
     }   
    } 
    else result = sName; 

    return result.trim(); 
} 

private static String capFirst(String text){ 

    if(text == null) return null; 
    text = text.toLowerCase().trim(); 

    String result = ""; 

    if(text.length() > 0){ 

     text = text.substring(0, 1).toUpperCase() + text.substring(1); 

     if(text.contains(" ")){ 

      for(String word : text.split(" ")){ 

       word = word.trim(); 
       if(word.length() > 0) result += " " + word.substring(0, 1).toUpperCase() + word.substring(1); 
      } 
     } 
     else result = text; 
    } 

    return result.trim(); 
} 

然后将侦听器添加到EditText的适当事件中,并使用YourClass.capitalize()设置它的文本。

+0

这是个好主意,谢谢。但如果用户已将资本化改回,那么好的行为不会再次大写。 – tse

0

我做了我自己的大写。 如果此字符是字符串中的最后一个字符,并且它位于任何非字母字符(或它是字符串中的单个字符)之后,它将大写上一个输入的字符。

public class EditName extends EditText { 
    public EditName(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     addTextChangedListener(new TextWatcher() { 
      String lastChanged = ""; 
      boolean isLastSingleCharChanged = false; 

      @Override 
      public void onTextChanged(CharSequence s, int start, int before, int count) { 
       // check if only last character was changed 
       isLastSingleCharChanged = 
         count - before == 1 // was added one character 
           && start + count == s.length() // last character was in changed group 
           && (start == 0 || count == 1); // or total change, or last character 
      } 

      @Override 
      public void afterTextChanged(Editable s) { 
       if (!isLastSingleCharChanged) return; // only if last character changed (see above) 

       int len = s.length(); 
       if (len == 0) return; 
       if (len > 1 && Character.isLetter(s.charAt(len - 2))) return; // correct letter only after none-letter 

       char c = s.charAt(len - 1); 
       if (!Character.isLetter(c)) return; 
       if (!Character.isLowerCase(c)) return; 

       String text = s.toString(); 
       if (text.equals(lastChanged)) return; // do not do the same correction twice 

       lastChanged = text; 
       EditName.this.setText(text.substring(0, text.length() - 1) 
         + Character.toUpperCase(c)); 
       EditName.this.setSelection(text.length()); // position cursor 
      } 

      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

      } 
     }); 
    } 
} 
相关问题