android текст Остановить EditText от получения фокуса при запуске Activity




клавиатура закрывает поле ввода android (20)

Будучи тем, что я не люблю загрязнять XML тем, что связано с функциональностью, я создал этот метод, который «прозрачно» крадет фокус с первого фокусируемого вида, а затем, при необходимости, удаляет себя!

public static View preventInitialFocus(final Activity activity)
{
    final ViewGroup content = (ViewGroup)activity.findViewById(android.R.id.content);
    final View root = content.getChildAt(0);
    if (root == null) return null;
    final View focusDummy = new View(activity);
    final View.OnFocusChangeListener onFocusChangeListener = new View.OnFocusChangeListener()
    {
        @Override
        public void onFocusChange(View view, boolean b)
        {
            view.setOnFocusChangeListener(null);
            content.removeView(focusDummy);
        }
    };
    focusDummy.setFocusable(true);
    focusDummy.setFocusableInTouchMode(true);
    content.addView(focusDummy, 0, new LinearLayout.LayoutParams(0, 0));
    if (root instanceof ViewGroup)
    {
        final ViewGroup _root = (ViewGroup)root;
        for (int i = 1, children = _root.getChildCount(); i < children; i++)
        {
            final View child = _root.getChildAt(i);
            if (child.isFocusable() || child.isFocusableInTouchMode())
            {
                child.setOnFocusChangeListener(onFocusChangeListener);
                break;
            }
        }
    }
    else if (root.isFocusable() || root.isFocusableInTouchMode())
        root.setOnFocusChangeListener(onFocusChangeListener);

    return focusDummy;
}

https://code.i-harness.com

У меня есть Activity в Android, с двумя элементами:

  1. EditText
  2. ListView

Когда моя Activity начинается, EditText сразу имеет фокус ввода (мигающий курсор). Я не хочу, чтобы какой-либо элемент управления имел фокус ввода при запуске. Я старался:

EditText.setSelected(false);

Неудачно. Как я могу убедить EditText не выбирать себя при запуске Activity ?


В onCreate вашей деятельности просто добавьте clearFocus() в свой элемент EditText. Например,

edittext = (EditText) findViewById(R.id.edittext);
edittext.clearFocus();

И если вы хотите перенаправить фокус на другой элемент, используйте requestFocus() . Например,

button = (Button) findViewById(R.id.button);
button.requestFocus();

Вы можете просто установить «focusable» и «focusable in touch mode» в значение true в первом TextView layout . Таким образом, когда активность начинается, TextView будет сфокусирован, но из-за своей природы вы не увидите ничего сосредоточенного на экране и, конечно же, клавиатура не будет отображаться ...


Да, я сделал то же самое - создаю «фиктивный» линейный макет, который получает первоначальный фокус. Кроме того, я установил «следующие» идентификаторы фокуса, чтобы пользователь не мог больше сконфигурировать его после прокрутки:

<LinearLayout 'dummy'>
<EditText et>

dummy.setNextFocusDownId(et.getId());

dummy.setNextFocusUpId(et.getId());

et.setNextFocusUpId(et.getId());

много работы только для того, чтобы избавиться от фокуса на взгляд ..

Спасибо


Добавьте android:windowSoftInputMode="stateAlwaysHidden" в теге активности файла Manifest.xml .

Source


Добавьте в метод onCreate следующее:

this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

Если у вас есть другое представление о вашей деятельности, например ListView , вы также можете:

ListView.requestFocus(); 

в вашем onResume() чтобы захватить фокус с editText .

Я знаю, что на этот вопрос был дан ответ, но просто предоставил альтернативное решение, которое сработало для меня :)


Запишите этот код внутри файла Manifest в разделе « Activity где вы не хотите открывать клавиатуру.

android:windowSoftInputMode="stateHidden"

Файл манифеста:

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.projectt"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="24" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
         <activity
            android:name=".Splash"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".Login"
            **android:windowSoftInputMode="stateHidden"**
            android:label="@string/app_name" >
        </activity>

    </application>

</manifest>

Напишите эту строку в макете родителя ...

 android:focusableInTouchMode="true"

Ни один из этих решений не работал для меня. То, как я исправляю автофокусировку, было:

<activity android:name=".android.InviteFriendsActivity" android:windowSoftInputMode="adjustPan">
    <intent-filter >
    </intent-filter>
</activity>

Поздно, но, возможно, полезно. Создайте фиктивный EditText в верхней части макета, затем вызовите myDummyEditText.requestFocus() в onCreate()

<EditText android:id="@+id/dummyEditTextFocus" 
android:layout_width="0px"
android:layout_height="0px" />

Кажется, это ведет себя так, как я ожидаю. Нет необходимости обрабатывать изменения конфигурации и т. Д. Мне это нужно для Activity с длинным TextView (инструкциями).


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


Проблема, похоже, исходит из свойства, которое я могу видеть только в XML form макета.

Обязательно удалите эту строку в конце объявления в тегах XML EditText :

<requestFocus />

Это должно дать что-то вроде этого:

<EditText
   android:id="@+id/emailField"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:inputType="textEmailAddress">

   //<requestFocus /> /* <-- without this line */
</EditText>

Простое решение: в AndroidManifest в теге Activity используйте

android:windowSoftInputMode="stateAlwaysHidden"

Самое простое, что я сделал, это сосредоточиться на другом представлении в onCreate:

    myView.setFocusableInTouchMode(true);
    myView.requestFocus();

Это остановило мягкую клавиатуру, и в EditText не было курсора.


Следующее останавливает редактирование edittext при создании, но хватайте его, когда вы прикасаетесь к ним.

<EditText
    android:id="@+id/et_bonus_custom"
    android:focusable="false" />

Таким образом, вы устанавливаете focusable в false в xml, но ключ находится в java, в который вы добавляете следующий прослушиватель:

etBonus.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        v.setFocusable(true);
        v.setFocusableInTouchMode(true);
        return false;
    }
});

Поскольку вы возвращаете false, то есть не потребляете событие, поведение фокусировки будет продолжаться, как обычно.


Существует более простое решение. Установите эти атрибуты в родительском макете:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mainLayout"
    android:descendantFocusability="beforeDescendants"
    android:focusableInTouchMode="true" >

И теперь, когда активность начнется, этот основной макет по умолчанию получит фокус.

Кроме того, мы можем удалить фокус из дочерних представлений во время выполнения (например, после завершения редактирования дочерних элементов), снова обратив внимание на основной макет, например:

findViewById(R.id.mainLayout).requestFocus();

Хороший комментарий от Guillaume Perrot :

android:descendantFocusability="beforeDescendants" кажется по умолчанию (целочисленное значение равно 0). Он работает, просто добавив android:focusableInTouchMode="true" .

Действительно, мы видим, что beforeDescendants заданы по умолчанию в ViewGroup.initViewGroup() (Android 2.2.2). Но не равно 0. ViewGroup.FOCUS_BEFORE_DESCENDANTS = 0x20000;

Благодаря Гийому.


Это идеальное и самое простое решение. Я всегда использую это в своем приложении.

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

Является ли фактическая проблема, что вы просто не хотите, чтобы она была сосредоточена? Или вы не хотите, чтобы она отображала виртуальную клавиатуру в результате фокусировки EditText ? Я действительно не вижу проблемы с тем, что EditText сосредоточился на запуске, но определенно проблема в том, что окно softInput открывается, когда пользователь явно не запрашивает сосредоточиться на EditText (и в результате откройте клавиатуру).

Если это проблема виртуальной клавиатуры, см. Документацию элемента AndroidManifest.xml <activity> .

android:windowSoftInputMode="stateHidden" - всегда скрывать его при вводе активности.

android:windowSoftInputMode="stateUnchanged" - не меняйте его (например, не показывайте его, если он еще не показан, но если он был открыт при вводе активности, оставьте его открытым).


используя информацию, предоставленную другими плакатами, я использовал следующее решение:

в макете XML

<!-- Dummy item to prevent AutoCompleteTextView from receiving focus -->
<LinearLayout
    android:id="@+id/linearLayout_focus"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:layout_width="0px"
    android:layout_height="0px"/>

<!-- AUTOCOMPLETE -->
<AutoCompleteTextView
    android:id="@+id/autocomplete"
    android:layout_width="200dip"
    android:layout_height="wrap_content"
    android:layout_marginTop="20dip"
    android:inputType="textNoSuggestions|textVisiblePassword"/>

in onCreate ()

private AutoCompleteTextView mAutoCompleteTextView;
private LinearLayout mLinearLayout;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mylayout);

    //get references to UI components
    mAutoCompleteTextView = (AutoCompleteTextView) findViewById(R.id.autocomplete);
    mLinearLayout = (LinearLayout) findViewById(R.id.linearLayout_focus);
}

и, наконец, in onResume ()

@Override
protected void onResume() {
    super.onResume();

    //do not give the editbox focus automatically when activity starts
    mAutoCompleteTextView.clearFocus();
    mLinearLayout.requestFocus();
}




android-edittext