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



ввода получить (25)

Попробуйте это перед первым редактируемым полем:

<TextView  
        android:id="@+id/dummyfocus" 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" 
        android:text="@string/foo"
        />

----

findViewById(R.id.dummyfocus).setFocusableInTouchMode(true);
findViewById(R.id.dummyfocus).requestFocus();

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

  1. EditText
  2. ListView

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

EditText.setSelected(false);

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


Будучи тем, что я не люблю загрязнять 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;
}

Запишите этот код внутри файла 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>

Следующее останавливает редактирование 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, то есть не потребляете событие, поведение фокусировки будет продолжаться, как обычно.


Вы можете достичь этого, создав манекен EditText с шириной и высотой 0dp , установленным в 0dp , и запросите фокус на этом представлении. Добавьте следующий фрагмент кода в свой XML-макет:

<EditText
    android:id="@+id/editText0"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:hint="@string/dummy"
    android:ems="10" 
    >
     <requestFocus />
    </EditText>

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

 android:focusableInTouchMode="true"

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

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

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

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


Для меня все, что работает на всех устройствах, это:

    <!-- fake first focusable view, to allow stealing the focus to itself when clearing the focus from others -->

    <View
    android:layout_width="0px"
    android:layout_height="0px"
    android:focusable="true"
    android:focusableInTouchMode="true" />

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


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

android:windowSoftInputMode="stateAlwaysHidden"

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

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

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

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

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


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

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

Простой ответ, просто добавьте это в родительский макет XML.

android:focusable="true" 
android:focusableInTouchMode="true"

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

в макете 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();
}

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

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

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


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

ListView.requestFocus(); 

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

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


Я попробовал несколько ответов индивидуально, но основное внимание по-прежнему уделяется EditText. Мне удалось решить его только с помощью двух из нижеприведенного решения.

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

(Ссылка из Silver https://.com/a/8639921/15695 )

и удалить

 <requestFocus />

в EditText

(Ссылка от floydaddict share )


<TextView
    android:id="@+id/TextView01"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:singleLine="true"
    android:ellipsize="marquee"
    android:marqueeRepeatLimit="marquee_forever"
    android:focusable="true"
    android:focusableInTouchMode="true"
    style="@android:style/Widget.EditText"/>

Мне нужно было очистить фокус от всех полей программно. Я просто добавил следующие два утверждения в мое основное определение макета.

myLayout.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
myLayout.setFocusableInTouchMode(true);

Вот и все. Исправлена ​​ошибка. Спасибо, Серебро, за то, что указал мне в правильном направлении.


Проблема, похоже, исходит из свойства, которое я могу видеть только в 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>

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

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

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


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

<LinearLayout 'dummy'>
<EditText et>

dummy.setNextFocusDownId(et.getId());

dummy.setNextFocusUpId(et.getId());

et.setNextFocusUpId(et.getId());

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

Спасибо


Единственное решение, которое я нашел, это:

  • Создайте LinearLayout (я не знаю, будут ли работать другие типы Layout)
  • Установите атрибуты android:focusable="true" и android:focusableInTouchMode="true"

И EditText не получит фокус после начала деятельности


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

Source


Измените свой манифест xml, чтобы добавить windowSoftInputMode в вашу деятельность:

<activity
    android:name=".YourActivity"
    android:windowSoftInputMode="adjustPan">
</activity>




android listview android-edittext