Force close when all characters are deleted from EditText field - android

My app is force closing when I delete the last of my characters from the edit text box. e.g. if I put in 456, 6 and 5 cause no problems but deleting 4 leads to the error.
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setupViews();
}
private void setupViews(){
milesBox = (EditText)findViewById(R.id.enter_miles);
try{
milesBox.addTextChangedListener(new TextWatcher(){
#Override
public void afterTextChanged(Editable s) {
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
#Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
addMiles();
}
});
}catch (Exception e){
this.showAnswer.setText("TextWatcher error");
this.milesBox.setText("");
}
}// end setupviews()
public void addMiles(){
try{
String edMiles = this.milesBox.getText().toString();
if(null==edMiles){
this.showAnswer.setText("Please input miles");
this.milesBox.setText(null);
}
double amiles = Double.parseDouble(edMiles);
setMiles(amiles);
}
catch (Exception e){
this.showAnswer.setText("Please input miles in numbers");
this.milesBox.setText(null);
addMiles();
//TODO check if this line causes errors
}
}
public double getMiles() {
return miles;
}
public void setMiles(double miles) {
this.miles=miles;
}

He broo
you have missed else here
if(null==edMiles){
this.showAnswer.setText("Please input miles");
this.milesBox.setText(null);
}
else{
double amiles = Double.parseDouble(edMiles);
setMiles(amiles);
}
here it will give number format exception because u r parsing null string

Change
if(null==edMiles){
To
if(null == edMiles || edMiles.length() == 0) {
or better use TextUtils.isEmpty(edMiles).
When you remove last char from edittext the toString method doesn't return null, it returns ""(empty string) as a result.

Related

In recylerview the edittext the values are repeating when fetched through the interface

Recylerview
#Override
public void onBindViewHolder(#NonNull CustomListview.ViewHolder holder, int position) {
holder.Sno.setText(""+(position+1));
//remove colth unwanted characters
String cloth = list.get(position).getCloth();
String withoutFirstCharacter = cloth.substring(2,cloth.length()-1); // index starts at zero
holder.Cloth.setText(""+withoutFirstCharacter);
holder.qty.setText(list.get(position).getQuantity());
holder.QtyId.setText(list.get(position).getQtyId());
holder.Dis.setText(list.get(position).getDispatchedQty());
holder.deliverd is a edittext
if (list.get(position).getValue()==null){
holder.deliverd.setText("0");
list.get(position).setValue("0");
} else {
holder.deliverd.setText(String.valueOf(list.get(position).getValue()));
}
holder.deliverd.addTextChangedListener(new TextWatcher() {
#Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
#Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (TextUtils.isEmpty(holder.deliverd.getText()))
{
list.get(position).setValue("0");
} else {
list.get(position).setValue(holder.deliverd.getText().toString());
}
int a = Integer.parseInt(list.get(position).getValue());
//str is arraylist
str.add(Integer.parseInt(list.get(position).getValue()));
Log.i( "str",String.valueOf(str));
//interface through pass the values to mainactivity
dtInterface.onSetValues(str);
// activity.array_val();
}
#Override
public void afterTextChanged(Editable s) {
}
});
}
Interface
public interface DataTransferInterface {
public void onSetValues(ArrayList<Integer> in );
}
MAinactivity interface implements and override the interface method
#Override
public void onSetValues(ArrayList<Integer> a )
{
HashMap<Integer, ArrayList<Integer>> hm=new HashMap<>();
hm.put(100,a);
//display hashmap element
Set s = hm.entrySet();
Iterator itr = s.iterator();
while (itr.hasNext()){
Map.Entry m = (Map.Entry)itr.next();
System.out.println(m.getKey()+":values:"+m.getValue());
Toast.makeText(this, "aaa"+m.getValue(),Toast.LENGTH_SHORT).show();
}
}
when i change the 1st,2nd,3rd edittext are correctly fetched the values one time. The problem is 4th,5th,etc edittext repeating the values 2 times and added to the arraylist. how to slove it.i tried more than 25days.. i attached the error below.
[![enter image description here][1]][1]
[enter link description here][1]
https://andriodretrofit.000webhostapp.com/WhatsAppVideo2020-02-03at83032PM.gif

How to find difference of two sum's result by onKeyUp()?

[enter image description here][1]I have eight EditText, five for Income & three for deduction and I have set a TextWatcher at all EditText by calling addTextChangedListener().
Now I have set the sum of first five EditText to TextView(value) and sum of other three EditText to TextView(ded_value). As whichever EditText is going to fill likewise sum is setting on respective TextView.
These TextView are showing the only total earning & total deduction and now I m am trying to set the net payable salary which will be difference of value,ded_value(means total earning-total deduction=net payable salary).
And the result of this defference should be diaplay on another TextView that is netsalaryvalue. As whichever(value,ded_value) TextView is going to changing likewise difference should be set on TextView(netsalaryvalue).
enter code here //this is income salry & deduction salary code
textWatcher=new TextWatcher() {
#Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
#Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
#Override
public void afterTextChanged(Editable s) {
//income code value
b_salary=et_bs.getText().toString();
d_allowance=et_da.getText().toString();
hr_allowance=et_hra.getText().toString();
t_allowance=et_ta.getText().toString();
m_allowance=et_ma.getText().toString();
//deduction code value
itax=et_itax.getText().toString();
pf=et_pf.getText().toString();
tds=et_tds.getText().toString();
if (!et_bs.getText().toString().isEmpty())
{
value.setText("");
value.setText(b_salary);
if (!et_da.getText().toString().isEmpty())
{
value.setText(String.valueOf(Integer.parseInt(b_salary)+Integer.parseInt(d_allowance)));
if (!et_hra.getText().toString().isEmpty())
{
value.setText(String.valueOf(Integer.parseInt(b_salary)+Integer.parseInt(d_allowance)+Integer.parseInt(hr_allowance)));
if (!et_ta.getText().toString().isEmpty())
{
value.setText(String.valueOf(Integer.parseInt(b_salary)+Integer.parseInt(d_allowance)+Integer.parseInt(hr_allowance)+Integer.parseInt(t_allowance)));
if (!et_ma.getText().toString().isEmpty())
{
value.setText(String.valueOf(Integer.parseInt(b_salary)+Integer.parseInt(d_allowance)+Integer.parseInt(hr_allowance)+Integer.parseInt(t_allowance)+Integer.parseInt(m_allowance)));
}
}
}
}
}
if (!et_itax.getText().toString().isEmpty())
{
ded_value.setText("");
ded_value.setText(itax);
if (!et_pf.getText().toString().isEmpty())
{
ded_value.setText(String.valueOf(Integer.parseInt(itax)+Integer.parseInt(pf)));
if (!et_tds.getText().toString().isEmpty())
{
ded_value.setText(String.valueOf(Integer.parseInt(itax)+Integer.parseInt(pf)+Integer.parseInt(tds)));
}
}
}
}
};
et_bs.addTextChangedListener(textWatcher);
et_da.addTextChangedListener(textWatcher);
et_hra.addTextChangedListener(textWatcher);
et_ta.addTextChangedListener(textWatcher);
et_ma.addTextChangedListener(textWatcher);
et_itax.addTextChangedListener(textWatcher);
et_pf.addTextChangedListener(textWatcher);
et_tds.addTextChangedListener(textWatcher);
// this is net payable salry code
textWatcher2=new TextWatcher() {
#Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
netsalaryvalue.setText("");
}
#Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
#Override
public void afterTextChanged(Editable s) {
totalincome=value.getText().toString();
totaldedu=ded_value.getText().toString();
if (!value.getText().toString().equals("")||!ded_value.getText().toString().equals(""))
{
if (!value.getText().toString().equals("00.00")||!ded_value.getText().toString().equals("00.00"))
{
netsalaryvalue.setText(String.valueOf(Integer.parseInt(totalincome)-Integer.parseInt(totaldedu)));
}
}
}
};
value.addTextChangedListener(textWatcher2);
ded_value.addTextChangedListener(textWatcher2);
strong text When I was finding only the sum then my code was running freely but when I had write the code for netpayablesalry then my app is going to crash. Now I m trying to resolve this issue but still now issue is not resolve, please help me.
strong text According to my question exact answer is:-
enter code here public void afterTextChanged(Editable s) {
basic=et_bs.getText().toString();
allowance=et_da.getText().toString();
value.setText(basic);
if (!et_da.getText().toString().isEmpty())
{
value.setText(""+(Integer.parseInt(basic)+Integer.parseInt(allowance)));
}
}
strong text now it is working which was I trying.
Do it like this
textWatcher=new TextWatcher() {
#Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
value.setText("");
}
#Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
basic=et_bs.getText().toString();
allowance=et_da.getText().toString();
if(!basic.isEmpty() && !allowance.isEmpty())
value.setText(""+(Integer.parseInt(basic)+Integer.parseInt(allowance)));
}
#Override
public void afterTextChanged(Editable s) {
}
};
you can also add these three lines in onAfterTextChanged
#Override
public void afterTextChanged(Editable s) {
basic=et_bs.getText().toString();
allowance=et_da.getText().toString();
if(!basic.isEmpty() && !allowance.isEmpty())
value.setText(""+(Integer.parseInt(basic)+Integer.parseInt(allowance)));
}
You could try this
#Override
public void onTextChanged(CharSequence s, int start,
int before, int count) {
basic=et_bs.getText().toString();
allowance=et_da.getText().toString();
////Check for null/empty/Not-Integer value
int first = 0;
int second = 0;
try {
first = Integer.parseInt(basic);
second = Integer.parseInt(allowance);
}
catch(Exception e ) {
}
value.setText(""+String.valueOf(first+second)));
}

How to replace particular word from edittext

I have one edittext: edittextmysite.
Now I want to provide default text, for example: "https://wwww.mysite.com/"
I have achieved it this as follows:
edittextmysite.setText("https://wwww.mysite.com/");
Selection.setSelection(edittextmysite.getText(), edittextmysite.getText().length());
edittextmysite.addTextChangedListener(new TextWatcher() {
#Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
#Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
#Override
public void afterTextChanged(Editable s) {
if (!s.toString().contains("https://wwww.mysite.com/")) {
edittextmysite.setText("https://wwww.mysite.com/");
Selection.setSelection(edittextmysite.getText(), edittextmysite.getText().length());
}
}
});
So if anyone enters text it will automatically be appended to the default, like this: https://wwww.mysite.com/<Mytext>
Now what I want is if anyone writes something like this in edittext:
https://wwww.mysite.com/https://wwww.mysite.com/helloworld
or
https://wwww.mysite.com/wwww.mysite.com/helloworld
or
https://wwww.mysite.com/wwww.anyothersite.com/helloworld
that it will automatically convert it to the correct format, like this:
https://wwww.mysite.com/helloworld
How can I achieve this?
#Override
public void afterTextChanged(Editable s) {
if (!s.toString().contains("https://wwww.mysite.com/")) {
String text = s.toString.subString(0, s.lastIndexOf("/"));
edittextmysite.setText(s.toString().replace(text, "https://wwww.mysite.com/");
Selection.setSelection(edittextmysite.getText(), edittextmysite.getText().length());
}
}
edittextmysite.addTextChangedListener(new TextWatcher() {
#Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
#Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
#Override
public void afterTextChanged(Editable s) {
if(edittextmysite.getText().toString().length() == 0)
edittextmysite.setText("https://wwww.mysite.com/" + s.toString());
else
edittextmysite.append(s.toString());
}
});
Here is what i have tried.
private String str = "https://wwww.mysite.com/";
#Override
public void afterTextChanged(Editable s) {
if (!s.toString().contains("https://wwww.mysite.com/")) {
edittextmysite.setText("https://wwww.mysite.com/");
Selection.setSelection(edittextmysite.getText(), edittextmysite.getText().length());
}
String s1 = s.toString();
String s2 = s1.substring(str.length());
if(s2.contains("/")) {
String s3 = s1.substring(str.length());
if (Patterns.WEB_URL.matcher(s3).matches()) {
// Valid url
edittextmysite.setText(s.toString().replace(s3, ""));
Selection.setSelection(edittextmysite.getText(), edittextmysite.getText().length());
}
}
}
This piece of code won't allow you to enter another URL and user can only enter string after URL as you explained above.
Thanks
Rather that editing the text afterwards, there are many nicer ways to accomplish this:
Place "https://example.com/" on the left of the edittext, then if you really have to, you can search the string for .com, www., etc. and remove it and the name they encapsulate using any algorithm found easily on the web. Then concatenate the strings.
Use a hint in the edittext.
here I have sharing complete working example. There is explanation along with it.
public class MainActivity extends AppCompatActivity implements TextWatcher {
String BASE_URL = "https://wwww.mysite.com";
EditText editText;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/*paste this editText --> https://wwww.mysite.com/https://wwww.mysite.com/helloworld <--*/
editText = findViewById(R.id.et);
editText.addTextChangedListener(this);
}
#Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
#Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
String text = s.toString().trim();
editText.removeTextChangedListener(this);
if (text.length() > 0) {
if (!text.contains(BASE_URL)) {
String tempText = BASE_URL +"/"+ text;
editText.setText(tempText); //setting text here
proceed(tempText); //sending here for further test, if pasted the link
} else {
proceed(text);
}
}
}
#Override
public void afterTextChanged(Editable s) {
}
private void proceed(String text) {
String newText="";
String firstHalf = text.substring(0,text.lastIndexOf('/'));
String secondHalf = text.substring(text.lastIndexOf('/',(text.length()-1)));
String[] words = firstHalf.split("/"); //Split the word from String
for (int i = 0; i < words.length; i++){ //Outer loop for Comparison
if (words[i] != null) {
for (int j = i + 1; j < words.length; j++){ //Inner loop for Comparison
if (words[i].equals(words[j])) //Checking for both strings are equal
words[j] = null; //Delete the duplicate words
}
}
}
//Displaying the String without duplicate words{
for (int k = 0; k < words.length; k++){
if (words[k] != null)
newText=newText+words[k];
}
StringBuffer formattedText = new StringBuffer((newText+secondHalf));
formattedText.insert(6,"//"); //length of https;//
editText.setText(formattedText);
//attaching textwatcher again
editText.addTextChangedListener(this);
//moving cusor pointer to the end point
editText.setSelection(editText.getText().toString().length());
}
}
You should fix the prefix text into EditText which can not be editable and user only can edit the text after base-url (like after https://wwww.mysite.com/ ).
So you should follow these steps
Prefix the base url to EditText and make it un-editable
Let user enter sub part of the url
Validate input with Patterns.WEB_URL.matcher(inputUrl).matches() for valid url. You can add this validation on TextChange of EditText or on click of a button.
Below is a custom EditText code which you can use directly
public class UrlEditText extends AppCompatEditText {
float mLeftPadding = -1;
public UrlEditText(Context context) {
super(context);
}
public UrlEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}
public UrlEditText(Context context, AttributeSet attrs,
int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
#Override
protected void onMeasure(int widthMeasureSpec,
int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
initPrefix();
}
#Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
String prefix = (String) getTag();
canvas.drawText(prefix, mLeftPadding,
getLineBounds(0, null), getPaint());
}
private void initPrefix() {
if (mLeftPadding == -1) {
String prefix = (String) getTag();
float[] widths = new float[prefix.length()];
getPaint().getTextWidths(prefix, widths);
float textWidth = 0;
for (float w : widths) {
textWidth += w;
}
mLeftPadding = getCompoundPaddingLeft();
setPadding((int) (textWidth + mLeftPadding),
getPaddingRight(), getPaddingTop(),
getPaddingBottom());
}
}
}
and in layout xml file, it would be like
<com.path_of_custom_view.UrlEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:tag="https://wwww.mysite.com/"
android:text="helloworld" />
Instead of using android:tag you can define custom attribute for this edittext.
And for input validation you can validate it like
String enteredUrl = textField.getText().toString();
if (Patterns.WEB_URL.matcher(enteredUrl).matches()) {
// Valid url
} else {
// Invalid url
}
You can Just store it as String and than simply String newReplacedString = stringtoReplace.replace("Phrase To Replace", "WHAT TO REPLACE WITH");
This one works for me, I hope this will work for you too.
#Override
public void afterTextChanged(Editable s) {
String text = edittextmysite.getText().toString();
String URL = "https://www.example.com/";
if (text.contains(URL)) {
String url = getUrl(URL, text);
if (!text.equals(url)) {
edittextmysite.setText(url);
edittextmysite.setSelection(url.length());
}
} else {
String tempUrl = URL + text;
String url = getUrl(URL, tempUrl);
if (!tempUrl.equals(url)) {
edittextmysite.setText(url);
edittextmysite.setSelection(url.length());
} else if (!text.contains(URL)) {
edittextmysite.setText(URL);
edittextmysite.setSelection(URL.length());
}
}
}
private String getUrl(String URL, String text) {
String urls[] = text.split("(?<!/)/(?!/)");
Log.v(TAG, Arrays.toString(urls));
String lastWord = urls[urls.length - 1];
String lastChar = text.substring(text.length() - 1);
if (lastChar.equals("/"))
lastWord = lastWord.concat(lastChar);
for (String url : urls) {
url = url.concat("/");
if (Patterns.WEB_URL.matcher(url).matches()) {
if (url.equals(URL)) {
if (!lastWord.contains("/"))
return url + lastWord;
else return text;
}
}
}
return URL;
}
In this code I tried your inputs, and its working.
It's not an elegant solution and I suggest you to use alternative UX for what you are trying to do entirely but if you really want to pursue this way then try the following code in your TextWatcher,
final String baseString="https://wwww.mysite.com/";
#Override
public void afterTextChanged(Editable s) {
if(!s.toString().contains(baseString)){
editText.setText(baseString+s.toString());
editText.setSelection(editText.length());
}else {
String regex = "\\b(https?|ftp|file)://[-a-zA-Z0-9+&##/%?=~_|!:,.;]*[-a-zA-Z0-9+&##/%=~_|]";
Pattern pattern=Pattern.compile(regex);
String subStr=s.toString().substring(baseString.length());
Matcher matcher= pattern.matcher(subStr);
if(matcher.matches()){
editText.setText(baseString+subStr.replaceAll(regex,""));
editText.setSelection(editText.length());
}else if(subStr.contains("https:")){
editText.setText(baseString+subStr.replace("https:",""));
editText.setSelection(editText.length());
}else if(subStr.contains("www.")){
editText.setText(baseString+subStr.replace("www.",""));
editText.setSelection(editText.length());
}else if(subStr.contains(".")){
editText.setText(baseString+subStr.replaceAll("\\.",""));
editText.setSelection(editText.length());
}else if(subStr.contains("//")){
editText.setText(baseString+subStr.replaceAll("//",""));
editText.setSelection(editText.length());
}else if(subStr.contains(":")){
editText.setText(baseString+subStr.replaceAll(":",""));
editText.setSelection(editText.length());
}
}
}
Once user starts typing, it sets our base string in the edittext and forces
user not to write anything that can be a part of uri. One important thing to consider when user is trying to hit backspace, this is taken care of using the special condition and user won't be able to remove base string once he/she starts typing.
Note: This solution can be optimized as well
Answer
You can set edittext text to not remove by user. So the predefined text will stay with ediitext and automatically append the new text.
Try this:
private EditText et;
private String str_value = "http://example.com/";
private String added_str;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et = findViewById(R.id.edittext);
et.setText(str_value);
et.setSelection(str_value.length());
et.addTextChangedListener(new TextWatcher() {
#Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
#Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if(start == str_value.length() - 1)
{
et.setText(str_value);
et.setSelection(str_value.length());
}
}
#Override
public void afterTextChanged(Editable s) {
}
});
Edited
If you want elimnate the domain name after user entered in the edittext. You can try below code
#Override
public void afterTextChanged(Editable s) {
if(s.length() > str_value.length()) {
added_str = s.toString().substring(str_value.length(), s.length()); //this will get text after predefined text.
if(Patterns.DOMAIN_NAME.matcher(added_str).matches() || added_str.contains("http:"))
{
et.setText(str_value);
et.setSelection(str_value.length());
}
}
}

Android - AutoCompleteTextView dynamic updating issue

well i'm trying to update the autoCompleteTextview ArrayAdapter dynamiclly each time text changed by using TextWathcer.
every time text changed there is an http request in a new AsyncTask and in the callback from the async task (onPostExecute) i call clear() from the adapter and adding new items to him and then call notifyDataSetChanged.
Unfortunately the auto complete drop down is never shown..
please, where do i go worng?!
here is the code:
AutoCompleteTextView acCountry = (AutoCompleteTextView)layout.findViewById(R.id.autoComplete);
final ArrayAdapter<RMAutoComplete.ListItem> countriesAdapter = new ArrayAdapter<RMAutoComplete.ListItem>(this.context,android.R.layout.simple_dropdown_item_1line);
acCountry.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (s.length() > 1)
{
new AsyncTask<String, Void, List<RMAutoComplete.ListItem>>(){
#Override
protected List<ListItem> doInBackground(String... params) {
List<ListItem> l = null;
try {
l = location.getCountryData(params[0]);
} catch (Exception e) {
Log.e(TAG,"error when getCountryData",e);
}
return l;
}
#Override
protected void onPostExecute(List<ListItem> countries) {
countriesAdapter.clear();
if (countries != null)
for (ListItem listItem : countries) {
countriesAdapter.add(listItem);
}
countriesAdapter.notifyDataSetChanged();
}
}.execute(s.toString());
}
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
public void afterTextChanged(Editable s) {}
}
);
Common mistake : Did you set the adapter to acCountry at all?

count a particular character in runtime in android

I want to restrict the user to put more than 4 period(.) in a edit text.
how to do this. please any body help
Please make use of following code.
public class Help extends Activity {
public static int count = 0;//use this to check is there are more that 4 '.' char
/** Called when the activity is first created. */
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
((EditText)findViewById(R.id.EditText01)).addTextChangedListener(new TextWatcher() {
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
if(count>=4){
//don't allow to right text
}
}
public void onTextChanged(CharSequence s, int start, int before,
int count) {
//check here if entered text contains more than 4 '.' character
}
#Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
});
}
Please check for logic i have not tested
Edittext e = (editText)Findviewbyid.....
String t= e.geteditable().gettext(); // check methods
if(s.equals(".") || s.equals("..") || s.equals("...")
{
throw some exception and reset it in the catch block
}
I could understand this from your question. is this what u wanted?
Following script counts all periods, but multiple periods are counted once: ... = ., and preriods at the beginning aren't counted.
String text = ((EditText)findViewById(R.id.yourEditText)).getText().toString();
if(text.matches("\\.*[^\\.]+\\.+[^\\.]+\\.+[^\\.]+\\.+[^\\.]+\\.+.+")){
// 4 or more '.', multiple '..' are counted once
}

Categories

Resources