Не удается запросить фокус на Spinner

У меня есть неприятная проблема с экраном. Экран состоит из набора счетчиков один под другим, а затем под счетчиком EditText.

Проблема в том, что когда экран запускается, EditText имеет фокус, а это означает, что некоторые счетчики находятся за пределами верхней части экрана. Как бы я ни старался, я не могу сфокусировать верхний Spinner ни с помощью <requestFocus/> в экранном XML, ни с помощью requestFocus() в коде. Я попытался сделать то, что предлагает requestFocus пропускает следующий EditText, и если я правильно следую предложению, это тоже не работает.

Чтобы воспроизвести проблему, создайте новый проект Android в Eclipse. main.xml это

<?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>

Код активности

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();
    }
}

Обратите внимание на попытки использования нескольких стилей requestFocus.

Это баг платформы или я что-то не так делаю?

Спасибо.


person SamStephens    schedule 07.02.2011    source источник


Ответы (3)


Из онлайновой документации:

Представление на самом деле не получит фокус, если оно не может быть сфокусировано (isFocusable() возвращает false) или если оно может быть сфокусировано, но не может быть сфокусировано в сенсорном режиме (isFocusableInTouchMode()), когда устройство находится в сенсорном режиме.

person StenaviN    schedule 29.09.2011

У меня была аналогичная проблема, я решил, выполнив две вещи:

1) Я устанавливаю объект Spinner сверху (в методе onCreate), чтобы убедиться, что мой код выполняется первым. 2) Я использовал следующее:

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

Дайте мне знать, если это поможет или вам нужна дополнительная помощь.

person MR Mido    schedule 03.05.2011
comment
Это правильный ответ. Хотя я не могу заставить его работать в xml. Android: focusable = истина Android: focusableInTouchMode = истина - person MinceMan; 07.06.2013
comment
Не работает для меня. Хотя счетчик находится в режиме прокрутки и не виден, когда я запускаю requestFocus(). - person Yesha; 25.04.2018

В моем случае это сработало.

Spinner s1 = (Spinner) findViewById(R.id.spinner1);
s1.requestFocusFromTouch();
s1.performClick();
person Rajesh Naddy    schedule 05.09.2018