2015-04-12 35 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) { 

      } 
     }); 
    } 
}