Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

requestFocus doesn't work properly for EditText

A lot of time was spent to solve the problem, and it looks easy, but I'm really tired and couldn't find the solution. I have an Activity, activity has 4 EditText components, 2 of them has popup menu (AlertDialog) which contain the list, next one - is disabled for edit, and last one - is editable, and should show the soft keyboard, when user is tapping on it.

Also, my root LinearLayout has LinearLayout which contain inside RelativeLayout. The last one is need for AdvBanner. Last LinearLayout(RelativeLayout) is aligned to the bottom of root layout.

The part of XML that describes it:

  <LinearLayout
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      android:layout_gravity="bottom"
      android:focusable="false"
      android:focusableInTouchMode="false" 
      android:gravity="bottom">
  <RelativeLayout 
      android:id="@+id/AdvLayoutReserveArea" 
      android:layout_width="fill_parent" 
      android:layout_height="50dp" 
      android:background="#FFFFFF"
      android:focusable="false"
      android:focusableInTouchMode="false" 
      android:gravity="bottom" /> 
  </LinearLayout>

When activity is start, editable EditText has focus with GREEN border and cursor is blinking. After few seconds left, the AdvBanner is loaded and shown. When it happens, editable EditText lost focus.. from this moment, my life be like a nightmare.

Let's look step by step.

Problem 1. If in THIS MOMENT (when Adv loaded and appears) user is editing an EditText field via the soft keyboard, focus is lost, border take a GRAY color, and if user continue to typing a text is have no result - symbols are not printed (CURSOR in EditText is too lost).

I THINK any user will be annoyed - when you typing text, and cursor is inactive, because in background some adv is loaded and it take focus for self.

To solve this, in method when Adv is loaded (is shown) I try to back focus manually to EditText by requestFocus method.

public void onAdLoaded() 
    {
// TODO Auto-generated method stub
// add app specific code for this event here...
// called when an ad is successfully displayed on device            
    CountEdit1.requestFocus();
}

Yes, the cursor is returned to EditText field, and if soft keyboard is active, user can still typing text, but border of EditText field stay GRAY...

NOTE: actually I'm not sure about the difference between GREEN and GRAY border of focused EditText.. GREEN is usually when user is tapping on it, and GRAY, probably, when we want to request a focus manually (using requestFocus() etc)

Problem 2. (As result of solvation Problem #1). After soft keyboard was closed, if user tap on editable EditText field, it take focus and cursor appears inside, but no reaction for showing soft keyboard again! Tapping of it do not show soft keyboard, but looks like the edit field in copy mode - when user can select a text and cut/copy it to clipboard.

My goal is easy for a first look. I just want to SAVE the cursor and focus to editable EditText field (CountEdit1) while soft keyboard is shown and user typing some text. And normal reaction when user tapping EditText - as usually, just show me the soft keyboard!

I read all issues here, I combined different methods (clearFocus, requestFocusFromTouch etc), just not enough of time and space to describe all that I tried to do to solve this. The main problems are described above.

Hope for help and solving the problem... Thanks in advance..

like image 581
Dimon Avatar asked Jul 01 '12 00:07

Dimon


People also ask

How do I show soft keyboard when EditText is focused?

android:windowSoftInputMode="stateAlwaysVisible" -> in manifest File. edittext. requestFocus(); -> in code. This will open soft keyboard on which edit-text has request focus as activity appears.

How do you Unfocus textfield on android?

Remove focus but remain focusable: editText. setFocusableInTouchMode(false); editText. setFocusable(false); editText.


5 Answers

Works for me:

InputMethodManager mgr = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
editField.requestFocus();
mgr.showSoftInput(editField, InputMethodManager.SHOW_IMPLICIT);
like image 180
iBog Avatar answered Oct 13 '22 14:10

iBog


The goal is solved, the workaround is an easier than I thought. Problem #2 is fixed by using onClick () method. Sufficient condition for appearing of soft keyboard that use of both clearFocus() and requestFocus() methods.

   CountEdit1.setOnClickListener(new OnClickListener() {

      @Override
      public void onClick(View v)
      {
              CountEdit1.clearFocus();
        CountEdit1.requestFocus();
      }
    });

The soft keyboard appears when user is tapping on the EditText field. Fixed.

like image 34
Dimon Avatar answered Oct 13 '22 16:10

Dimon


userInput.post(new Runnable() {
            public void run() {
                userIdInput.requestFocus();

            }
        });

Have a go at this and tell if your problem is still unsolved.

like image 43
Swayam Avatar answered Oct 13 '22 14:10

Swayam


You should request focus after view is created in fragment or activity:

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    CountEdit1.requestFocus();
}
like image 29
zYberIs Avatar answered Oct 13 '22 16:10

zYberIs


try this:

public void onAdLoaded() 
    {  
  final Handler handler = new Handler();
             handler.postDelayed(new Runnable() {
                 @Override
                 public void run() {
                     CountEdit1.requestFocus();
                     InputMethodManager mgr = (InputMethodManager) base.getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
                     mgr.showSoftInput(CountEdit1, InputMethodManager.SHOW_IMPLICIT);
                     CountEdit1.setSelection(CountEdit1.getText().length());
                 }
             },0);
}
like image 40
Irshu Avatar answered Oct 13 '22 15:10

Irshu