how to regain focus on a edit text when expandable list is reloaded...?

2k Views Asked by At

I have a ExpandableListView in which i am loading custom layouts in both group and child views.

They are having some edit text fields.

When i click on the edit text, the soft keyboard appears, that time the list is reloaded, but focus will not be on the edit text.

As a result the input i am typing is not entered in that edit text.

If i clicked on the edit text again i can enter the values.

But I want to regain its focus even after reloading the list view.

I tried with storing the last clicked view and storing it in temporary variable, requestFocus() on reloading, but its not working.

How to achieve this..?

here is a screen shot.

image

If anybody have an idea please help me..!

Thanks in Advance.

5

There are 5 best solutions below

0
On BEST ANSWER

Manage the SoftInput Keyboard for your activity.

Take a look at android:windowSoftInputMode

0
On

I think you will find the answer here: ExpandableListView child items don't get focus when touched

This guy has an issue that sounds the same as yours.

0
On

I had similar problems with calling requestFocus() inside onCreate() or onResume(). I was able to solve this by setting the focus with a slight delay. Something like this might work for you:

new Handler().postDelayed(new Runnable() {

            @Override
            public void run() {
                viewToFocus.requestFocus();

            }
        }, 100);

I think the root of the problem might be that the AndroidFramework sets the Focus after onResume() is processed. So that's why a delay might help.

0
On

After the listView is expanded, you gain force gain focus on the editText by adding this line,

editText.requestFocus();

1
On

I tried with storing the last clicked view and storing it in temporary variable, requestFocus() on reloading, but its not working.

What isn't working? Is your activity being recreated so the temporary variable is being lost? If so, then this answer might help you.

I haven't used an ExpandableListView before, but I've had to solve a similar problem in my code. When an orientation change happens the activity is destroyed and then recreated, so I use onRetainNonConfigurationInstance() to store information that I want to preserve.

Here's some sample code:

  protected StoredState mStoredState;

  @Override
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);

    final Object data = getLastNonConfigurationInstance();

    if (data == null)
    {
      // First time initialization
      mStoredState = new StoredState();
    }
    else
    {
      // StoredState data exists
      mStoredState = (StoredState)data;

      if (mStoredState.mFieldToGiveFocusTo != -1)
      {
        // Give focus to the field that had focus before the
        // activity was recreated
        View viewToFocus = findViewById(mStoredState.mFieldToGiveFocusTo);
        viewToFocus.requestFocus();
      }
    }
  }

  @Override
  public Object onRetainNonConfigurationInstance()
  {
    return mStoredState;
  }

  /**
   * Class to store the information about this activity when the orientation
   * is changed
   */
  private static class StoredState
  {
    int mFieldToGiveFocusTo;

    private StoredState()
    {
      mFieldToGiveFocusTo = -1;
    }
  }

Then you just need to set mStoredState.mFieldToGiveFocusTo when the user first touches the EditText.