Multiline AutoCompleteTextView not accepting scrolling touch - android

I created a multiline AutoCompleteTextView component inside an activity whose main root is a scrollview (because my activity contains lots of controls), and set its max and min lines to 4. It loads the text properly, but when I try to scroll inside the AutoCompleteTextView, the whole activity scrolls. Here is the code of the AutoCompleteTextView:
<AutoCompleteTextView
android:id="#+id/txtData"
android:inputType="textMultiLine"
android:lines="4"
android:minLines="4"
android:maxLines="4"
android:gravity="top|left"
android:textColor="#000000"
android:layout_below="#id/lblAddress"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:scrollbars="vertical"
android:textSize="16sp"
/>
Any idea what I should set to keep the scroll focus inside the AutoCompleteTextView?

Try to change the dropdown height android:dropDownHeight
This would work when its inside a scrollView and the AutoCompleteTextView is near the top.
To get the focus try this
autoCompleteTextView.setOnFocusChangeListener(new OnFocusChangeListener() {
public void onFocusChange(View v, boolean hasFocus) {
if(hasFocus) {
autoCompleteTextView.showDropDown();
}
}
});

Related

TextInputLayout with an exposed dropdown menu does not return to its original form (hint center vertical) if no item is selected

if you open the drop-down list and without selecting any item close the drop-down list, the hint will remain in the top position. TextInputLayout will return to its original state (the hint is centered vertically) only after the focus moves to another element.
XML:
<com.google.android.material.textfield.TextInputLayout
android:id="#+id/hint"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:hint="#string/register_children_child_name_hint"
style="#style/Widget.MaterialComponents.TextInputLayout.FilledBox.ExposedDropdownMenu"
app:endIconDrawable="#drawable/ic_dropdown"
app:boxStrokeWidth="0dp"
app:boxStrokeWidthFocused="0dp"
app:boxStrokeColor="#color/transparent"
app:boxBackgroundColor="#color/black_5_new"
app:boxCornerRadiusTopStart="5dp"
app:boxCornerRadiusTopEnd="5dp"
app:boxCornerRadiusBottomStart="5dp"
app:boxCornerRadiusBottomEnd="5dp"
app:hintTextColor="#color/gray_new">
<AutoCompleteTextView
android:id="#+id/edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="none"
android:textAppearance="#style/NormalText"
android:textSize="17sp"
tools:ignore="LabelFor" />
</com.google.android.material.textfield.TextInputLayout>
how can I make it return to its original state if the drop-down list is closed and no items are selected?
I tried clearFocus() but it didn’t help.
You can use something like:
AutoCompleteTextView autoCompleteTextView = ((AutoCompleteTextView)textinputlayout.getEditText());
autoCompleteTextView.setAdapter(adapter);
autoCompleteTextView.setOnDismissListener(new AutoCompleteTextView.OnDismissListener() {
#Override
public void onDismiss() {
autoCompleteTextView.clearFocus();
}
});
I found out why when opening the drop-down list, TextInputLayout immediately went into an active state and did not return to its original state when drop-down list closed. I call setFocusableInTouchMode(true) in my code. When I removed this line, everything worked as it should.

EditText either editable or non editable and clickable

I have a RecyclerView with the following items layout:
<LinearLayout
android:orientation="horizontal"
....
android:clickable="#{viewModel.isClickable}"
android:onClick="#{viewModel::onPropertyClicked}">
<LinearLayout
....
android:clickable="false">
<TextView
android:clickable="false"
android:focusable="false"
.... />
<EditText
...
android:text="#{viewModel.propertyValue}"
android:focusable="#{viewModel.isEditTextClickable}"
android:focusableInTouchMode="#{viewModel.isEditTextClickable}"
android:cursorVisible="#{viewModel.isEditTextClickable}"
android:clickable="#{!viewModel.isEditTextClickable}"/>
</LinearLayout>
<ImageView ... />
</LinearLayout>
I want depending on a boolean the EditText to be either editable or non-editable and clickable. For some unknown reason, my EditText doesn't dispatch the touch event to the parent's parent. If I click on the TextView though, the onClick method is called.
If I specify the onClick of the EditText it works. I am wondering why though it doesn't work through the root ViewGroup's onClick.
I have tried many different things like
Disable/Enable the EditText using inputType
If EditText is non-editable and clickable set focusable to false and clickable to true
Disable/Enable EditText using enabled true/false
It's really weird because the EditText is actually almost the same as the TextView that behaves as expected.
Any ideas?
try to change this
android:clickable="#{!viewModel.isEditTextClickable}"/>
for
android:clickable="#{viewModel.isEditTextClickable}"/>

EditText box cursor appear after touching box?

I am using EditText in my app. I want that the cursor appears only after user touches the edit text box. how could I do this?
I have used this to hide the cursor first.
EditText
android:id="#+id/editText1"
android:layout_width="match_parent"
android:layout_height="90dp"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginTop="16dp"
android:cursorVisible="false"
android:ems="10"
how could I show it after touch?
Try to request focus for other views instead of letting your edittext get the focus in the first time view loaded. <requestFocus /> put this to your main view.
Try : edittext.clearFocus(); you can put it in the onCreate() it will set focus to the first view.
Implement :
mText = (EditText) findViewById(R.id.editText1);
OnTouchListener otl = new OnTouchListener() {
#Override
public boolean onTouch(View v, MotionEvent event) {
mText.requestFocus()
return true;
}
};
mText.setOnTouchListener(otl);
Go to Layout file of your project and remove <requestFocus /> from the EditTexts for which you want the cursor to appear only when the user taps on the EditText box.
If in your layout file
<requestFocus />
is there, then just remove from the Edittext and because of this the cusrsor is only visible when user tap on to Edittext.

Android : clear focus on edittext when activity starts

I've some settings page in my app. Once the activity gets starts directly it focus to edittext and i used following code to clear foucs.
<RelativeLayout
android:id="#+id/RequestFocusLayout"
android:focusable="true"
android:focusableInTouchMode="true"
android:layout_width="0px"
android:layout_height="0px"/>
and in java code
RelativeLayout focuslayout = (RelativeLayout) findViewById(R.id.RequestFocusLayout);
focuslayout.requestFocus();
The above code is working fine when activity starts at first time and if same activity starts again, automatically edittext get focus.
Can anyone help me to solve this issue.
Actually, the first focusable view in the activity receives initial focus. If that happens to be your EditText, it will be initially focused.
If you don't want that, here's your options:
Focus another view
Programmatically identify what view you do want to give initial focus to.
#Override
protected void onStart() {
super.onStart();
findViewById( R.id.yourOtherViewId ).requestFocus();
}
Make an earlier view in your layout focusable
If you rather it appears as though "no view has initial focus" you could make the parent view group focusable. In the following example, I make my LinearLayout focusable by setting android:focusableInTouchMode="true":
<LinearLayout
android:focusableInTouchMode="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<EditText
...
If Come back from other activity edittext get focused.
put these line onStart() or on onReusme()
RelativeLayout focuslayout = (RelativeLayout) findViewById(R.id.RequestFocusLayout);
focuslayout.requestFocus();
If your EditText is a child of your RelativeLayout you can use android:descendantFocusability to request the focus:
<RelativeLayout
android:id="#+id/RequestFocusLayout"
android:focusable="true"
android:layout_width="0px"
android:layout_height="0px"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true" />
I used the solution shown up in this page but it didn't work. Add this attribute to your activity tag into AndroidManifest:
android:windowSoftInputMode="stateHidden"
It works perfectly.
Me realy help only android:focusableInTouchMode="true" in my parent view group.
Put the code to remove the focus in your onStart() method and it should work fine.
In the layout XML file, specify an imeOption on your EditText:
android:imeOptions="actionGo"
Next, add an action listener to your EditText in the Activity's java file
mYourEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_GO) {
// hide virtual keyboard
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mYourEditText.getWindowToken(), 0);
return true;
}
return false;
}
});
Where mYourEditText is an EditText object
If on starting the Activity it focuses on EditText on the screen.
use
android:focusableInTouchMode="true"
in the parent containing that EditText. Like if EditText is inside a RelativeLayout use this line in the RelativeLayout.

Android: Force EditText to remove focus? [duplicate]

This question already has answers here:
How to stop EditText from gaining focus when an activity starts in Android?
(54 answers)
Closed 7 years ago.
I would like to be able to remove the focus from the EditText. For example if the Keyboard appears, and the user hides it with the back button, I would like the focus and the cursor to disappear. How can it be done?
You can make cursor and focus disappear by
edittext.clearFocus();
But detect when the key board hide is a hard work.
You can add this to onCreate and it will hide the keyboard every time the Activity starts.
You can also programmatically change the focus to another item.
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
Add LinearLayout before EditText in your XML.
<LinearLayout
android:focusable="true"
android:focusableInTouchMode="true"
android:clickable="true"
android:layout_width="0px"
android:layout_height="0px" />
Or you can do this same thing by adding these lines to view before your 'EditText'.
<Button
android:id="#+id/btnSearch"
android:layout_width="50dp"
android:layout_height="50dp"
android:focusable="true"
android:focusableInTouchMode="true"
android:gravity="center"
android:text="Quick Search"
android:textColor="#fff"
android:textSize="13sp"
android:textStyle="bold" />
<EditText
android:id="#+id/edtSearch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginRight="5dp"
android:gravity="left"
android:hint="Name"
android:maxLines="1"
android:singleLine="true"
android:textColorHint="#color/blue"
android:textSize="13sp"
android:textStyle="bold" />
Remove focus but remain focusable:
editText.setFocusableInTouchMode(false);
editText.setFocusable(false);
editText.setFocusableInTouchMode(true);
editText.setFocusable(true);
EditText will lose focus, but can gain it again on a new touch event.
Add these two properties to your parent layout (ex: Linear Layout, Relative Layout)
android:focusable="true"
android:focusableInTouchMode="true"
It will do the trick :)
remove autofocus edittext android
It's working for me
Edit In the link they suggest to use LinearLayout, but simple View will work
<View
android:id="#+id/focus_thief"
android:layout_width="1dp"
android:layout_height="1dp"
android:focusable="true"
android:focusableInTouchMode="true" />
Then if this "thief" is placed at the top of the layout (to be first focusable item) calls to clearFocus() will work.
You can also include android:windowSoftInputMode="stateAlwaysHidden" in your manifest action section.
This is equivalent to :
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
but in XML way.
FYI, you can also hide the keyboard with codes:
// hide virtual keyboard
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mYourEditText.getWindowToken(), 0);
To hide the keyboard when activity starts.. write the following code in onCreate()..
InputMethodManager imm = (InputMethodManager)
getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);
To clear focus and remove cursor from edittext.....
editText.clearFocus();
editText.setCursorVisible(false);
try to use this one on your view
it worked for me:
<View
android:id="#+id/fucused"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="true"
android:focusableInTouchMode="true"/>
Add to your parent layout where did you put your EditText this android:focusableInTouchMode="true"
you have to remove <requestFocus/>
if you don't use it and still the same problem
user LinearLayout as a parent and set
android:focusable="true"
android:focusableInTouchMode="true"
Hope it's help you.
This is my very first answer on SO, so don't be too harsh on me if there are mistakes. :D
There are few answers floating around the SO, but I feel the urge to post my complete solution cause this drove me nuts. I've grabbed bits and pieces from all around so forgive me if I don't give respective credits to everyone... :)
(I'll simplify my result cause my view has too many elements and I don't wanna spam with that and will try to make it as generic as possible...)
For your layout you need a parent your EditText and parent view defined something like this:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="#+id/lytContainer"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true">
<EditText android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="#+id/etEditor"
android:inputType="number"
android:layout_gravity="center"
android:hint="#string/enter_your_text"
android:textColor="#android:color/darker_gray"
android:textSize="12dp"
android:textAlignment="center"
android:gravity="center"
android:clickable="true"/>
</LinearLayout>
So, I needed a few things here. I needed to have a Placeholder for my EditText - which is that -
android:hint="hint"
Also,
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"
made it happen for EditText not to be focused on entering the Activity and later on in the Activity itself when setting it this setting helps so you can set onTouchListener on it to steal the focus away from EditText.
Now, in the Activity:
package com.at.keyboardhide;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.view.View.OnTouchListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.LinearLayout;
public class MainActivity extends Activity implements OnTouchListener{
private EditText getEditText;
private LinearLayout getLinearLayout;
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
setContentView(R.layout.keyboardmain);
getEditText = (EditText)findViewById(R.id.etEditor);
getLinearLayout = (LinearLayout)findViewById(R.id.lytContainer);
getLinearLayout.setOnTouchListener(this);
getEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
#Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
Log.d("EDTA", "text was entered.");
getEditText.clearFocus();
imm.hideSoftInputFromWindow(barcodeNo.getWindowToken(), 0);
return true;
}
return false;
}
});
}
#Override
public boolean onTouch(View v, MotionEvent event) {
if(v==getLinearLayout){
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getEditText.getWindowToken(), 0);
getEditText.clearFocus();
return true;
}
return false;
}
}
Few of the answers for bits I found on this question page, and the part with the Activity solution I found on this blog. The rest I missed which I had to figure out myself was clearing focus on the EditText which I added to both inside the setOnEditorActionListener and onTouchLister for the parent view.
Hope this helps someone and saves their time. :)
Cheers,
Z.
In the comments you asked if another view can be focused instead of the EditText. Yes it can. Use .requestFocus() method for the view you want to be focused at the beginning (in onCreate() method)
Also focusing other view will cut out some amount of code. (code for hiding the keyboard for example)
I had the same problem. It made me more than crazy.
I had an extended Dialog with a ScrollView that had a TableLayout with extended LinearLayout that contained a SeekBar and a EditText.
The first EditText had always autofocus after showing the Dialog and after finishing editing the text over the keyboard the EditText still had the focus and the keyboard was still visible.
I tried nearly all solutions of this thread and none worked for me.
So here my simple solution: (text = EditText)
text.setOnEditorActionListener( new OnEditorActionListener( ){
public boolean onEditorAction( TextView v, int actionId, KeyEvent event ){
if( (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER) ||
(actionId == EditorInfo.IME_ACTION_DONE) ){
text.clearFocus( );
InputMethodManager iMgr = null;
iMgr = (InputMethodManager)mContext.getSystemService( Context.INPUT_METHOD_SERVICE );
iMgr.hideSoftInputFromWindow( text.getWindowToken(), 0 );
}
return true;
}
});
By the way I didn't used any of the following snippets to solve it:
//setFocusableInTouchMode( true )
//setFocusable( true )
//setDescendantFocusability( ViewGroup.FOCUS_BEFORE_DESCENDANTS )
AND I didn't used a spacer item like a View with width and height of 1dp.
Hopefully it helps someone :D
editText.setFocusableInTouchMode(true)
The EditText will be able to get the focus when the user touch it.
When the main layout (activity, dialog, etc.) becomes visible the EditText doesn't automatically get the focus even though it is the first view in the layout.
You can also include android:windowSoftInputMode="stateAlwaysHidden" in your manifest action section.
This is equivalent to:
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
You can avoid any focus on your elements by setting the attribute android:descendantFocusability of the parent element.
Here is an example:
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="#+id/search__scroller"
android:descendantFocusability="blocksDescendants"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true" >
</ScrollView>
Here, the attribute android:descendantFocusability set to "blocksDescendants" is blocking the focus on the child elements.
You can find more info here.
check your xml file
<EditText
android:id="#+id/editText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="14sp" >
**<requestFocus />**
</EditText>
//Remove **<requestFocus />** from xml

Categories

Resources