When an EditText has a focus, I want to select all text inside by default, but it doesn't work:
editText.setOnFocusChangeListener(new OnFocusChangeListener() {
#Override
public void onFocusChange(View view, boolean hasFocus) {
if (hasFocus) {
// Go to the end
editText.setSelection(getEditTextView().getText().length());
// Select all the content
editText.selectAll();
}
}
});
Thank you very much guys!
There are 2 good way to select the text in an EditText :
Inside your main.xml :
android:selectAllOnFocus="true"
Or :
editText.setSelectAllOnFocus(true);
(If you want to do it programatically)
SOURCE : Select all text inside EditText when it gets focus
I am creating a program that write in EditText by barcode reader so I don't want to show the keyboard immediately even if I focused on it I don't wanna it to be visible , I need to press a button to show keyboard only to Edit sometimes .
and thanks
I would disable the EditText button from the beginning:
editText.setEnabled(false);
And to answer your question, yes. Even if it is disabled, you can change the text. Disabled only means user can't change it. You can programmatically edit it.
Then when the button is pressed:
button.setOnClickListener(new OnClickListener() {
#Override
public void onClick(View v) {
editText.setEnabled(true);
editText.requestFocus();
}
});
This should automatically show the keyboard when the button is pressed.
Bonus:
If you want to disable the EditText once the editing is done, you can do this:
editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
#Override
public void onFocusChange(View v, boolean hasFocus) {
if(!hasFocus) {
editText.setEnabled(false);
}
}
});
I have three edittext. In first and second i get data from user with keyboard. In third edittext i open DatePickerDialog , get data from it and show edittext.
Here is my question. While user skip to other edittext with keyboard next button , how can i understand that third edittext is activated ?
You can use onfocus changelistenerlike this:
name = (EditText) findViewById(R.id.liganame);
name.setOnFocusChangeListener(this);
email = (EditText) findViewById(R.id.email);
email.setOnFocusChangeListener(this);
date = (EditText) findViewById(R.id.date);
date.setOnFocusChangeListener(this);
and check the id of your datepicker edittext in onfocuschange like this:
#Override
public void onFocusChange(View v, boolean hasFocus) {
if(v.getId() == R.id.date && hasFocus){
//your code here....
}
}
I build an android application. I have an EditText. I want to save changes (or anything else) automatically after the user change the text.
Now I use
editText.addTextChangedListener(textWatcher);
and
TextWatcher textWatcher = new TextWatcher() {
public void afterTextChanged(Editable s) {
...
}
But it saves the changes after every little change (add \ remove a letter), and I want that it'll be saved only after the user finished (closed the keyboard, clicked on a different edittext, etc. ).
How can I do that?
Implement onFocusChange of setOnFocusChangeListener and there's a boolean parameter for hasFocus. When this is false, you've lost focus to another control and you should save the data of editext. for example
EditText editText= (EditText) findViewById(R.id.editText);
editText.setOnFocusChangeListener(new OnFocusChangeListener() {
public void onFocusChange(View v, boolean hasFocus) {
if(!hasFocus) {
//SAVE THE DATA
}
}
});
Implement setOnFocusChangeListener for all EditTexts and you should handle Back Press event too. If the user change the data of edittext and didn't goto another EditText and pressed back then edited vallue will not save. So should use onKeyDown or onBackPressed too
As Kotlin is now official android language:
var editText = findViewById<EditText>(R.id.editText)
editText.onFocusChangeListener = OnFocusChangeListener { _, hasFocus ->
if (!hasFocus) {
//SAVE THE DATA
}
}
I want an EditText which creates a DatePicker when is pressed. So I write the following code:
mEditInit = (EditText) findViewById(R.id.date_init);
mEditInit.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
showDialog(DATEINIT_DIALOG);
}
});
But when I press the EditText the action is the typical: a cursor waiting for typing text instead show the Dialog I want.
The keyboard seems to pop up when the EditText gains focus. To prevent this, set focusable to false:
<EditText
...
android:focusable="false"
... />
This behavior can vary on different manufacturers' Android OS flavors, but on the
devices I've tested I have found this to to be sufficient. If the keyboard still pops up, using hints instead of text seems to help as well:
myEditText.setText("My text"); // instead of this...
myEditText.setHint("My text"); // try this
Once you've done this, your on click listener should work as desired:
myEditText.setOnClickListener(new OnClickListener() {...});
Normally, you want maximum compatibility with EditText's normal behaviour.
So you should not use android:focusable="false" as, yes, the view will just not be focusable anymore which looks bad. The background drawable will not show its "pressed" state anymore, for example.
What you should do instead is the following:
myEditText.setInputType(InputType.TYPE_NULL);
myEditText.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
// showMyDialog();
}
});
myEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
#Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
// showMyDialog();
}
}
});
By setting the input type to TYPE_NULL, you prevent the software keyboard from popping up.
By setting the OnClickListener and OnFocusChangeListener, you make sure that your dialog will always open when the user clicks into the EditText field, both when it gains focus (first click) and on subsequent clicks.
Just setting android:inputType="none" or setInputType(InputType.TYPE_NULL) is not always enough. For some devices, you should set android:editable="false" in XML as well, although it is deprecated. If it does not work anymore, it will just be ignored (as all XML attributes that are not supported).
I had this same problem. The code is fine but make sure you change the focusable value of the EditText to false.
<EditText
android:id="#+id/date"
android:focusable="false"/>
I hope this helps anyone who has had a similar problem!
Default working of EditText:
On first click it focuses and on second click it handles onClickListener so you need to disable focus. Then on first click the onClickListener will handle.
To do that you need to add this android:focusableInTouchMode="false" attribute to your EditText. That's it!
Something like this:
<EditText
android:id="#+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:focusableInTouchMode="false"
android:inputType="text" />
Here is the solution I implemented
mPickDate.setOnKeyListener(new View.OnKeyListener() {
#Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
showDialog(DATE_DIALOG_ID);
return false;
}
});
OR
mPickDate.setOnFocusChangeListener(new View.OnFocusChangeListener() {
#Override
public void onFocusChange(View v, boolean hasFocus) {
showDialog(DATE_DIALOG_ID);
}
});
See the differences by yourself.
Problem is since (like RickNotFred said) TextView to display the date & edit via the DatePicker. TextEdit is not used for its primary purpose.
If you want the DatePicker to re-pop up, you need to input delete (1st case) or de focus (2nd case).
Ray
If you use OnClick action on EditText like:
java:
mEditInit = (EditText) findViewById(R.id.date_init);
mEditInit.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
showDialog(DATEINIT_DIALOG);
}
});
or kotlin:
editTextChooseDate.setOnClickListener {
showDialog(DATEINIT_DIALOG)
}
So, it will work perfectly if you put into xml of your EditText the following lines:
android:inputType="none"
android:focusable="false"
android:cursorVisible="false"
For example:
<EditText
android:id="#+id/date_init"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text=""
android:hint="Select Date"
android:inputType="none"
android:focusable="false"
android:cursorVisible="false"/>
or for MaterialDesign
<com.google.android.material.textfield.TextInputLayout
android:id="#+id/layoutEditTextChooseDate"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent">
<com.google.android.material.textfield.TextInputEditText
android:id="#+id/date_init"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text=""
android:hint="Select Date"
android:inputType="none"
android:focusable="false"
android:cursorVisible="false"/>
</com.google.android.material.textfield.TextInputLayout>
See https://gist.github.com/Reacoder/0b316726564f85523251:
editText.setOnFocusChangeListener { _, hasFocus ->
if (hasFocus) {
// onClick(editText)
}
}
editText.setOnTouchListener { _, motionEvent ->
if (motionEvent.action == MotionEvent.ACTION_DOWN) {
// onClick(editText)
}
false
}
=== Old answer ===
Nice topic. Well, I have done so.
In XML file:
<EditText
...
android:editable="false"
android:inputType="none" />
In Java-code:
txtDay.setOnClickListener(onOnClickEvent);
txtDay.setOnFocusChangeListener(onFocusChangeEvent);
private View.OnClickListener onOnClickEvent = new View.OnClickListener() {
#Override
public void onClick(View view) {
dpDialog.show();
}
};
private View.OnFocusChangeListener onFocusChangeEvent = new View.OnFocusChangeListener() {
#Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus)
dpDialog.show();
}
};
IMHO I disagree with RickNotFred's statement:
Popping a dialog when an EditText gets
focus seems like a non-standard
interface.
Displaying a dialog to edit the date when the use presses the an EditText is very similar to the default, which is to display a keyboard or a numeric key pad. The fact that the date is displayed with the EditText signals to the user that the date may be changed. Displaying the date as a non-editable TextView signals to the user that the date may not be changed.
The following works perfectly for me.
First set your date picker widget's input to 'none' to prevent the soft keyboard from popping up:
<EditText android:inputType="none" ... ></EditText>
Then add these event listeners to show the dialog containing the date picker:
// Date picker
EditText dateEdit = (EditText) findViewById(R.id.date);
dateOfBirthEdit.setOnTouchListener(new OnTouchListener() {
#Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
showDialog(DIALOG_DATE_PICKER);
}
return false;
}
});
dateEdit.setOnFocusChangeListener(new OnFocusChangeListener() {
#Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
showDialog(DIALOG_DATE_PICKER);
} else {
dismissDialog(DIALOG_DATE_PICKER);
}
}
});
One last thing. To make sure typed days, months, or years are correctly copied from the date picker, call datePicker.clearFocus() before retrieving the values, for instance via getMonth().
This Works For me:
mEditInit = (EditText) findViewById(R.id.date_init);
mEditInit.setKeyListener(null);
mEditInit.setOnFocusChangeListener(new View.OnFocusChangeListener() {
#Override
public void onFocusChange(View v, boolean hasFocus) {
if(hasFocus)
{
mEditInit.callOnClick();
}
}
});
mEditInit.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
showDialog(DATEINIT_DIALOG);
}
});
Here is what worked for me
Set editable to false
<EditText android:id="#+id/dob"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="Date of Birth"
android:inputType="none"
android:editable="false"
/>
Then add an event listener for OnFocusChange
private View.OnFocusChangeListener onFocusChangeDOB= new View.OnFocusChangeListener() {
#Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus){
showDialog(DATE_DIALOG_ID);
}
}
};
As Dillon Kearns suggested, setting focusable to false works fine.
But if your goal is to cancel the keyboard when EditText is clicked, you might want to use:
mEditText.setInputType(0);
Why did not anyone mention setOnTouchListener? Using setOnTouchListener is easy and all right, and just return true if the listener has consumed the event, false otherwise.
The problem with solutions using OnFocusChangeListener is that they interpret any focus gain as a click. This is not 100% correct: your EditText might gain focus from something else than a click.
If you strictly care about click and want to detect click consistently (regardless of focus), you can use a GestureDetector:
editText.setOnConsistentClickListener { /* do something */ }
fun EditText.setOnConsistentClickListener(doOnClick: (View) -> Unit) {
val gestureDetector = GestureDetectorCompat(context, object : GestureDetector.SimpleOnGestureListener() {
override fun onSingleTapUp(event: MotionEvent?): Boolean {
doOnClick(this#setOnConsistentClickListener)
return false
}
})
this.setOnTouchListener { _, motionEvent -> gestureDetector.onTouchEvent(motionEvent) }
}
For kotlin, you could use this
editText!!.showSoftInputOnFocus = false