12

I've got an annoying issue with a screen. The screen consists of a bunch of Spinners one under the other, and then underneath the spinner, an EditText.

The problem is that when the screen starts, the EditText has focus, meaning that some Spinners are off the top of the screen. Try as I might, I cannot make the top Spinner start focused, either by using <requestFocus/> in the screen XML, or by using requestFocus() in code. I've attempted to do what requestFocus skipping next EditText suggests, and if I'm following the suggestion correctly, it doesn't work either.

To reproduce the issue, create a new Android project in Eclipse. main.xml is

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <Spinner 
        android:id="@+id/spinner"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">   
        <requestFocus />
    </Spinner>
    <EditText  
        android:id="@+id/edittext"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

The activity code is

package nz.co.kb.testspinner;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;

public class TestSpinner extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        setContentView(R.layout.main);
        View view = getLayoutInflater().inflate(R.layout.main, null);
        final View spinner = view.findViewById(R.id.spinner);
        view.post(new Runnable() {
            public void run() {
                spinner.requestFocus();
            }
        });
        setContentView(view);
        spinner.requestFocus();
    }
}

Note multiple styles of requestFocus attempted.

Is this a platform bug, or am I doing something wrong?

Thanks.

Community
  • 1
  • 1
SamStephens
  • 5,721
  • 6
  • 36
  • 44

3 Answers3

21

I had a similar problem, I solved by doing two things:

1) I set the Spinner object on top (Within the onCreate method) just to make sure that my code gets executed first. 2) I used the following:

Spinner s1 = (Spinner) findViewById(R.id.spinner1);
        s1.setFocusable(true);
        s1.setFocusableInTouchMode(true);

Let me know if this helps or you need any further help.

Shailendra Madda
  • 20,649
  • 15
  • 100
  • 138
MR Mido
  • 1,618
  • 4
  • 25
  • 35
  • 4
    This is the right answer. Though I cannot get it to work in the xml. android:focusable="true" android:focusableInTouchMode="true" – MinceMan Jun 07 '13 at 19:19
  • Not working for me. Although the spinner is in a scrollview and not really visible when I trigger requestFocus(). – Yesha Apr 25 '18 at 11:59
7

From online documentation:

A view will not actually take focus if it is not focusable (isFocusable() returns false), or if it is focusable and it is not focusable in touch mode (isFocusableInTouchMode()) while the device is in touch mode.

StenaviN
  • 3,687
  • 24
  • 34
3

In my case,this worked out.

Spinner s1 = (Spinner) findViewById(R.id.spinner1);
s1.requestFocusFromTouch();
s1.performClick();
Rajesh Naddy
  • 1,120
  • 12
  • 17