Android InputType layout parameter - how to allow negative decimals?

AndroidLayout

Android Problem Overview


I have a layout which has three fields for the entry of three map coordinates. So far so good. I'm using android:inputType="numberDecimal" in the layout. When entering the field the user gets the numeric keypad. Still good.

However, when a negative coordinate needs to be entered, there is no apparent way to do this.

23.2342 works fine. 232.3421 works fine. -11.23423 can not be entered - there is no way to enter the leading negative sign, or even wrap the coordinate in ().

I'm sure I can go the route of changing this to straight text inputType, and then use a regular expression to validate that what was entered is in fact a numeric coordinate, handle error messaging back to the user, etc. But I'd rather not go that route.

I have Googled and Stackoverflowed this question for a couple hours with no luck. Any suggestions?

Android Solutions


Solution 1 - Android

Unless I'm missing something this is all you need

android:inputType="numberDecimal|numberSigned"

Solution 2 - Android

Please use this code

 et.setInputType(InputType.TYPE_NUMBER_FLAG_SIGNED | InputType.TYPE_CLASS_NUMBER);

Solution 3 - Android

You have to add numberSigned in the EditText tag of your layout (*.xml)

 <EditText android:inputType="numberDecimal|numberSigned"></EditText>

Good luck!

Solution 4 - Android

set InputType.TYPE_NUMBER_FLAG_SIGNED in EditText.setInputType

Solution 5 - Android

I think that creating your own custom keylistener may be your best bet. I did something similar. I created a SignedDecimalKeyListener like this:

public class SignedDecimalKeyListener extends NumberKeyListener 
{
	private char[] mAccepted;
	private static SignedDecimalKeyListener sInstance;
	
    private static final char[] CHARACTERS = new char[] { '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.' };
	
	@Override
	protected char[] getAcceptedChars()
	{
		return mAccepted;
	}

	private SignedDecimalKeyListener()
	{
		mAccepted = CHARACTERS;
	}
	
	public static SignedDecimalKeyListener getInstance()
	{
		if(sInstance != null) 
			return sInstance;
		sInstance = new SignedDecimalKeyListener();
		return sInstance;
	}
	
	public int getInputType()
	{
		return InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL;
	}
	
	@Override
	public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend)
	{
		CharSequence out = super.filter(source, start, end, dest, dstart, dend);
		
		if(out != null)
		{
			source = out;
			start = 0;
			end = out.length();
		}
		
		//Only allow a '-' to be the very first char
		//and don't allow '.' to be the first char
		if(dstart > 0 && source.equals("-") || dstart == 0 && source.equals("."))
		{
			SpannableStringBuilder stripped = null;

			stripped = new SpannableStringBuilder(source, start, end);
			stripped.delete(start, end);

			if(stripped != null)
				return stripped;
		}
		else if(source.equals("."))
		{
			for(int lo = dend-1; lo > 0; lo--)
			{
				char c = dest.charAt(lo);
				if(source.equals(String.valueOf(c)))
				{
					SpannableStringBuilder stripped = null;

					stripped = new SpannableStringBuilder(source, start, end);
					stripped.delete(start, end);

					if(stripped != null)
						return stripped;
				}
			}
		}
			
		if(out != null)
			return out;
		else
			return null;
	}
}

And then use this custom keylistener with your edittext like this:

EditText myEditText = (EditText)findViewById(R.id.myedittext);
myEditText.setKeyListener(SignedDecimalKeyListener.getInstance());

Solution 6 - Android

i m not sure about the input type but you can always create your own text filter and attach it on an editText field. that one is pretty simple. you can do the check on every character and only allow the numbers, dot or any custom character you like.

Solution 7 - Android

Ended up using Pattern and Matcher for each of the axes, leaving the actual text input format open.

Three axes fields, submit button triggers onSave. Fields are validated and either the insert occurs, or error message is raised to submitter about required format for the Axes fields. Proper format is 1-3 digits, optionally prefaced by '-', optionally followed by '.' and additional digits.

Try this code :

private View.OnClickListener onSave=new View.OnClickListener(){
    public void onClick(View v){
        Pattern xAxis = Pattern.compile("[-+]?([0-9]*\\.)?[0-9]+");
        Matcher mForX = xAxis.matcher(xaxis.getText().toString());

        Pattern yAxis = Pattern.compile("[-+]?([0-9]*\\.)?[0-9]+");
        Matcher mForY = yAxis.matcher(yaxis.getText().toString());
		
        Pattern zAxis = Pattern.compile("[-+]?([0-9]*\\.)?[0-9]+");
        Matcher mForZ = zAxis.matcher(zaxis.getText().toString());
		
        //If Axis X and Axis Y and Axis Z are all valid entries, the proceed.
        if(mForX.find() && mForY.find() && mForZ.find()){
             //handle insert or update statement here
        }else{
             //give error message regarding correct Axis value format
        }
   }

}

Solution 8 - Android

This is working for me.

etbox.setInputType(InputType.TYPE_NUMBER_FLAG_SIGNED | InputType.TYPE_CLASS_NUMBER);

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionEBMView Question on Stackoverflow
Solution 1 - AndroidKevin BurandtView Answer on Stackoverflow
Solution 2 - AndroidArchieView Answer on Stackoverflow
Solution 3 - AndroidedwindhView Answer on Stackoverflow
Solution 4 - AndroidPinkiView Answer on Stackoverflow
Solution 5 - AndroidVMcPherronView Answer on Stackoverflow
Solution 6 - AndroidDArkOView Answer on Stackoverflow
Solution 7 - AndroidEBMView Answer on Stackoverflow
Solution 8 - AndroidPooja KelodiaView Answer on Stackoverflow