Edit Text in ListActivity ListView loses focus when keyboard comes up
Asked Answered
E

7

26

I have searched and searched for an answer to this question and everything that looked like an answer has not worked so I guess I will just ask.

I have a couple of EditText boxes added to a ListView that is the basis to a ListActivity. When I set the windowSoftInputMode to adjustPan and click in an EditText it works until you click on it again and then the keyboard covers it up. When I use adjustResize it works except when the keyboard comes up the EditText loses focus and I have to tap on it again to type.

I was trying to figure out how to catch the onResize but that seems to be associated with the View and not the activity and I'm not entirely sure how to listen for it. I have also tried all sorts of focusable settings on the EditText boxes and the ListView itself (as suggested in other posts I read) that don't seem to help either.

Enterectomy answered 2/8, 2011 at 20:54 Comment(2)
Is it possible to show a screenshot of what it looks like? Also some code might be helpful.Junket
Possible duplicate of Focusable EditText inside ListViewWidget
E
66

All you really need to do is apply this to your ListView:

XML:

android:descendantFocusability="afterDescendants"

Java:

listView.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
Edify answered 8/3, 2013 at 13:6 Comment(5)
Oh my goodness thank you! This came back around as a bigger problem today and so I just saw this answer and it seems to work!Enterectomy
So this solution mostly works. Problem is that the first focusable edit box always gets selected when the SIP comes up. This is a problem if the edit box I'm trying to select isn't the first focusable one. Still trying to work out how to catch this which puts me in a similar place to where I was. Is there a way to set a view's focus order to be first even if it isn't first in the layout?Enterectomy
I have no idea why all the other SO answers recommend beforeDescendants. afterDescendants is the only one that's worked for me, and also makes perfect sense in terms of the docs.Levity
thanks a lot , makes me wonder ,why android doesnt do this automatically or provide hints in studio for the same Also this problem is quite common but is not recognised in attentionSclerosed
@AbhishekMathur studio is not awere that this view is used in a ListView / RecyclerViewEdify
D
2

For me a combination of the following helped me (especially number 3):

1) Add the following to the related Activity in the manifest file, this is required for your ListView to be resized to fill only the area above the softKeyboard:

android:windowSoftInputMode="adjustResize"

2) With the below the ListView will ONLY get focus only if none of its descendants want it. The descendants (the EditText) needs to get and keep focus.

<ListView
...
android:descendantFocusability="afterDescendants"/>

3) The automatic showing/hiding of the Spelling Suggestions bar right above the keyboard keeps triggering the ListView to refresh. I turned the Suggestions off for any EditText in my ListView.

<EditText
...
android:inputType="textNoSuggestions|textVisiblePassword" />
Dropsonde answered 30/11, 2015 at 20:53 Comment(0)
E
2

recycler view works best and no need to mess around with any other properties anywhere.

Enneastyle answered 1/2, 2017 at 6:43 Comment(1)
I agree. I tried EVERYTHING to fix the behaviour of EditText in ListView, and NOTHING worked. I migrated to using RecyclerView (see developer.android.com/guide/topics/ui/layout/recyclerview) and it all works like a dream, with no nasty hacks. And the migration was easy because I was already using the ViewHolder model in my ListView adapter.Cunctation
C
2

In my case it perfect worked with adding this like of code to manifest:

android:windowSoftInputMode="adjustPan"
Cineraria answered 26/5, 2018 at 11:43 Comment(0)
J
0

Have you tried after you do adjustResize making sure to reset the focus to the EditText by doing something like EditText.requestFocus(); so that it has focus again and the user doesn't have to tap it again. you can use EditText.isFocused() to see if it is focused (true) or not (false) in a debugging log statement or something as well.

you might need to set the field to focusable as well using SetFocusable() but be careful because this could potentially take away the focus from the ListView itself and prevent you from being able to scroll or select things later so you will have to play around with the setting focusable and is focused stuff.

Junket answered 2/8, 2011 at 21:13 Comment(3)
I was looking into trying to catch the onResize but as it is associated with the view not the activity I'm not entirely sure how to do it. I tried a lot of different variations of setting the focus that I got from other similar questions but none of them seem to help.Enterectomy
perhaps it would be better to not resize the keyboard and instead move your edittext somewhere that will be above the keyboard? Is there a specific reason you need the textbox where it is?Arabeila
Yes, that is the specified design.Enterectomy
K
0

I have experienced exactly the same issue in my project.

To resolve the issue I have subclassed the EditText and handled the "Back" button press - to make sure that my EditTextclears focus at that moment.

Check this solution, on how to do it.

Good luck.

Kuomintang answered 22/3, 2012 at 7:40 Comment(0)
P
0
mViewHolder.editText = (EditText)convertView.findViewById(R.id.editText1);
            mViewHolder.editText.setTag(position);
            mViewHolder.editText.setTextColor(0xFF000000);
            mViewHolder.editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
                public void onFocusChange(View v, boolean hasFocus) {
                    if (!hasFocus) {
                        EditText et =(EditText)v.findViewById(R.id.editText1);
                        editTextArrayList.set(position,et.getText().toString().trim());
                    }
                }
            });

Hi below link may help for you http://mylearnandroid.blogspot.in/2014/06/listview-problem-while-scrolling.html

Paramaribo answered 23/6, 2014 at 14:56 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.