2014-01-30 37 views
3

大家好我正在做一個應用程序,它在edittext末尾有一個不可編輯的字符串。Android編輯文本末尾帶有不可編輯的字符串

例如,

數量_ __ .00

我想要做這樣的事情。

這是我到目前爲止已經試過:

etQuantity.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void afterTextChanged(Editable s) { 
      // TODO Auto-generated method stub 

      StringBuilder stringBuilder = new StringBuilder(); 

      stringBuilder.append(".00"); 

      String str = s.toString(); 
      String finalString = str + stringBuilder.toString(); 

      etQuantity.setText(finalString); 
      Log.d("String", "" + finalString); 

     } 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
      // TODO Auto-generated method stub 
     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 

      StringBuilder stringBuilder = new StringBuilder(); 

      stringBuilder.append(".00"); 

      String str = s.toString(); 
      String finalString = str + stringBuilder.toString(); 

      etQuantity.setText(finalString); 
      Log.d("String", "" + finalString); 

     } 

    }); 

但我得到了一個錯誤:

01-30 09:49:33.541: E/AndroidRuntime(4294): FATAL EXCEPTION: main 
01-30 09:49:33.541: E/AndroidRuntime(4294): java.lang.StackOverflowError 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.text.SpannableStringBuilder.checkRange(SpannableStringBuilder.java:1013) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.text.SpannableStringBuilder.getChars(SpannableStringBuilder.java:913) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.text.TextUtils.getChars(TextUtils.java:74) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.text.method.ReplacementTransformationMethod$ReplacementCharSequence.getChars(ReplacementTransformationMethod.java:151) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.text.TextUtils.getChars(TextUtils.java:74) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.text.MeasuredText.setPara(MeasuredText.java:106) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.text.StaticLayout.generate(StaticLayout.java:239) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.text.DynamicLayout.reflow(DynamicLayout.java:284) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.text.DynamicLayout.<init>(DynamicLayout.java:170) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.widget.TextView.makeSingleLayout(TextView.java:5986) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.widget.TextView.makeNewLayout(TextView.java:5884) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.widget.TextView.checkForRelayout(TextView.java:6423) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.widget.TextView.setText(TextView.java:3696) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.widget.TextView.setText(TextView.java:3554) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.widget.EditText.setText(EditText.java:80) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.widget.TextView.setText(TextView.java:3529) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at com.innovalynx.vms.fragments.SalesOrderDetailFragment$1.afterTextChanged(SalesOrderDetailFragment.java:92) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.widget.TextView.sendAfterTextChanged(TextView.java:7247) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.widget.TextView.setText(TextView.java:3703) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.widget.TextView.setText(TextView.java:3554) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.widget.EditText.setText(EditText.java:80) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.widget.TextView.setText(TextView.java:3529) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at com.innovalynx.vms.fragments.SalesOrderDetailFragment$1.afterTextChanged(SalesOrderDetailFragment.java:92) 
01-30 09:49:33.541: E/AndroidRuntime(4294):  at android.widget.TextView.sendAfterTextChanged(TextView.java:7247) 

我做錯了任何事物請點我給它。您的幫助將得到真正的讚賞。

回答

2

onTextChanged()是不修改的EditText文本的地方。

從DOC

這種方法被調用來通知您,S中,在啓動開始計數的字符剛剛取代了之前有長度舊文本。 嘗試從此回調中更改s是錯誤的。

所以afterTextChanged()可以做的工作。


使用目前的做法,你需要一些步驟去除TextWatcher,設置文本,以及TextWatcherback添加到EditText上。這樣,沒有任何內容正在聽您的EditText更改,並且不會導致StackOverflowError錯誤。

etQuantity.addTextChangedListener(new TextWatcher() { 
    @Override 
    public void afterTextChanged(Editable s) { 
     String str = s.toString(); 
     if (str.contains(".00")) { 
      if (! str.endsWith(".00")) { 
       str = str.replace(".00", "") + ".00"; 
      } 
     } else { 
      str = str + ".00"; 
     } 
     etQuantity.removeTextChangedListener(this); // Remove listener 
     etQuantity.setText(str);     // Set Text 
      etQuantity.setSelection(str.length() - 3); // Set selection 
     etQuantity.addTextChangedListener(this); // Add back the listener 
    } 

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

    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
    } 
}); 

另一種方式是添加像TextView多一個視圖.00

+0

是的,我刪除了我的代碼在ontextchanged,但它仍然是一樣的。 – Dunkey

+0

添加了佈局代碼。檢查 –

+0

我試過這個,但我想實現這一點。追加部分 – Dunkey

0

如果您想在edittext末尾添加一個不可編輯的字符串,請遵循這些複雜代碼的簡單方法。

簡單地將多餘的不可編輯文本連接到可改變的文本。

是否有下面的代碼中的任何問題:

String str = "your data"; 
etQuantity.setText(str + ".00"); 

//for restrict user to delete 
etQuantity.setFocusable(false); 
etQuantity.setClickable(false); 

OR

String str = "your data"; 
etQuantity.setText(str + ".00"); 
etQuantity.setKeyListener(null); 

當我們可以做簡單的字符串操作的所有東西,那麼爲什麼使用複雜的方法,有時會令混亂。

+0

我想這裏面afterTextChanged無濟於事 – Dunkey

+0

首先刪除所有textwatcher東西,嘗試簡單地說,怎麼我看不到任何東西在這裏,這將迫使你使用textwatcher。只需在您的一般方法中寫入,如onCreate或任何用戶定義。 – Ranjit

+0

你能告訴我你爲什麼在這裏使用textwatcher。僅用於添加額外的文本或其他問題。 – Ranjit

相關問題