Android: принудительно EditText удалить фокус?

Я хотел бы удалить фокус из EditText. Например, если появляется Клавиатура, и пользователь скрывает ее с помощью кнопки "Назад", мне бы хотелось, чтобы фокус и курсор исчезли. Как это можно сделать?

Ответ 1

Вы можете добавить это в onCreate, и он будет скрывать клавиатуру каждый раз, когда запускается активность.

Вы также можете программно изменить фокус на другой элемент.

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

Ответ 2

Вы можете сделать курсор и фокус исчезнуть на

edittext.clearFocus();

Но обнаруживайте, когда скрыть клавиатуру - это тяжелая работа.

Ответ 3

Добавьте LinearLayout до EditText в свой XML.

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

Или вы можете сделать то же самое, добавив эти строки для просмотра перед вашим "EditText".

<Button
    android:id="@+id/btnSearch"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:gravity="center"
    android:text="Quick Search"
    android:textColor="#fff"
    android:textSize="13sp"
    android:textStyle="bold" />

<EditText
    android:id="@+id/edtSearch"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_centerVertical="true"
    android:layout_marginRight="5dp"
    android:gravity="left"
    android:hint="Name"
    android:maxLines="1"
    android:singleLine="true"
    android:textColorHint="@color/blue"
    android:textSize="13sp"
    android:textStyle="bold" />

Ответ 4

Удалите фокус, но оставайтесь в фокусе:

editText.setFocusableInTouchMode(false);
editText.setFocusable(false);
editText.setFocusableInTouchMode(true);
editText.setFocusable(true);

EditText потеряет фокус, но может снова получить его при новом событии касания.

Ответ 5

удалить автофокус edittext android

Он работает для меня

Изменить. В ссылке они предлагают использовать LinearLayout, но простой просмотр будет работать

<View
    android:id="@+id/focus_thief"
    android:layout_width="1dp"
    android:layout_height="1dp"
    android:focusable="true"
    android:focusableInTouchMode="true" />

Затем, если этот "вор" помещен в верхнюю часть макета (чтобы быть первым настраиваемым элементом), вызовы clearFocus() будут работать.

Ответ 6

Добавьте эти два свойства в родительский макет (например: Linear Layout, Relative Layout)

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

Он выполнит трюк:)

Ответ 7

Вы также можете включить android: windowSoftInputMode = "stateAlwaysHidden" в разделе действия манифеста.

Это эквивалентно:

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

но в формате XML.

FYI, вы также можете скрыть клавиатуру с помощью кодов:

// hide virtual keyboard
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mYourEditText.getWindowToken(), 0);

Ответ 8

вам нужно удалить <requestFocus/>

если вы не используете его и все еще ту же проблему

user LinearLayout в качестве родителя и установите

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

Надеюсь, он вам поможет.

Ответ 9

попробуйте использовать это в своем представлении это сработало для меня:

<View
    android:id="@+id/fucused"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:focusable="true"
    android:focusableInTouchMode="true"/>

Ответ 10

Чтобы скрыть клавиатуру при запуске активности, напишите следующий код в onCreate()..

InputMethodManager imm = (InputMethodManager)
getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);

Чтобы очистить фокус и удалить курсор из edittext.....

editText.clearFocus();

editText.setCursorVisible(false);

Ответ 11

Это мой самый первый ответ на SO, поэтому не будьте слишком суровы на меня, если есть ошибки.: D

Есть несколько ответов, плавающих вокруг SO, но я чувствую, что хочу опубликовать свое полное решение, потому что это заставило меня с ума сойти. Я схватил кусочки со всех сторон, поэтому простите меня, если я не дам соответствующие кредиты всем...:)

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

Для вашего макета вам нужен родительский элемент, в котором ваш EditText и родительский вид определяют что-то вроде этого:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
              android:orientation="vertical"
              android:layout_width="match_parent" 
              android:layout_height="match_parent"
              android:id="@+id/lytContainer"
              android:descendantFocusability="beforeDescendants"
              android:focusableInTouchMode="true">
<EditText android:layout_width="fill_parent" 
              android:layout_height="wrap_content" 
              android:id="@+id/etEditor"
              android:inputType="number"
              android:layout_gravity="center" 
              android:hint="@string/enter_your_text"
              android:textColor="@android:color/darker_gray" 
              android:textSize="12dp"
              android:textAlignment="center" 
              android:gravity="center" 
              android:clickable="true"/>
</LinearLayout>

Итак, мне нужно было кое-что здесь. Мне нужно было иметь Placeholder для моего EditText - вот что -

Android: намек = "намек"

Кроме того,

android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"

сделало так, чтобы EditText не фокусировался на входе в Activity, а затем в самой Activity при настройке этого параметра, поэтому вы можете установить onTouchListener на него, чтобы украсть фокус от EditText.

Теперь в Управлении:

package com.at.keyboardhide;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.view.View.OnTouchListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.LinearLayout;

public class MainActivity extends Activity implements OnTouchListener{
private EditText getEditText;
private LinearLayout getLinearLayout;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.getWindow().setSoftInputMode(
            WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

    setContentView(R.layout.keyboardmain);
    getEditText = (EditText)findViewById(R.id.etEditor);
    getLinearLayout = (LinearLayout)findViewById(R.id.lytContainer);
    getLinearLayout.setOnTouchListener(this);

    getEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (actionId == EditorInfo.IME_ACTION_DONE) {
                Log.d("EDTA", "text was entered.");
                getEditText.clearFocus();
                imm.hideSoftInputFromWindow(barcodeNo.getWindowToken(), 0);
                return true;
            }
            return false;
        }
    });
}
@Override
public boolean onTouch(View v, MotionEvent event) {
    if(v==getLinearLayout){
        InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(getEditText.getWindowToken(), 0);
        getEditText.clearFocus();
        return true;
        }
    return false;
    }
}

Несколько ответов на бит, которые я нашел на этой странице вопросов, и часть с решением Activity, которое я нашел на этом blog. Остальное, что я пропустил, которое я должен был выяснить, это очистить внимание на EditText, который я добавил как внутри setOnEditorActionListener, так и onTouchLister для родительского представления.

Надеюсь, это помогает кому-то и экономит свое время.:)

Cheers, Z.

Ответ 12

В комментариях вы спросили, можно ли сфокусировать другое представление вместо EditText. Да, оно может. Используйте метод .requestFocus() для представления, которое вы хотите сфокусировать в начале (в методе onCreate())

Кроме того, фокусировка другого вида вырезает некоторый код. (например, код для скрытия клавиатуры)

Ответ 13

Добавьте в родительский макет, где вы положили EditText этот android:focusableInTouchMode="true"

Ответ 14

Вы также можете включить android:windowSoftInputMode="stateAlwaysHidden" в свой раздел действий манифеста.

Это эквивалентно:

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

Ответ 15

У меня была та же проблема. Это сделало меня более сумасшедшим.

У меня был расширенный диалог с ScrollView, в котором был TableLayout с расширенным LinearLayout, содержащим SeekBar и EditText.

Первый EditText всегда имел автофокус после показа диалогового окна и после завершения редактирования текста над клавиатурой EditText все еще имел фокус, и клавиатура все еще была видна.

Я пробовал почти все решения этой темы, и никто не работал у меня.

Итак, вот мое простое решение: (text = EditText)

text.setOnEditorActionListener( new OnEditorActionListener( ){
    public boolean onEditorAction( TextView v, int actionId, KeyEvent event ){
        if( (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER) ||
            (actionId == EditorInfo.IME_ACTION_DONE) ){
            text.clearFocus( );
            InputMethodManager iMgr = null;
            iMgr = (InputMethodManager)mContext.getSystemService( Context.INPUT_METHOD_SERVICE );
            iMgr.hideSoftInputFromWindow( text.getWindowToken(), 0 );
        }
        return true;
    }
});

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

//setFocusableInTouchMode( true )
//setFocusable( true )
//setDescendantFocusability( ViewGroup.FOCUS_BEFORE_DESCENDANTS )

И я не использовал элемент spacer, например View с шириной и высотой 1dp.

Надеюсь, это поможет кому-то: D

Ответ 16

editText.setFocusableInTouchMode(true)

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

Ответ 17

EditText.setOnKeyListener(new OnKeyListener() {
            public boolean onKey(View view, int keyCode, KeyEvent event) {
                if (keyCode == KeyEvent.KEYCODE_ENTER) {
                    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(URLText.getWindowToken(), 0); 
                    EditText.setFocusable(false);
                    EditText.setFocusableInTouchMode(true);
                    return true;
                } else {
                    return false;
                }
            }
        });

Ответ 18

Вы можете избежать фокусировки на своих элементах, установив атрибут android: descendantFocusability родительского элемента.

Вот пример:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/search__scroller"
android:descendantFocusability="blocksDescendants"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true" >
</ScrollView>

Здесь атрибут android: descendantFocusability, установленный на "blocksDescendants", блокирует фокус на дочерних элементах.

Вы можете найти более подробную информацию здесь.

Ответ 19

check your xml file
 <EditText
            android:id="@+id/editText1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="14sp" >

            **<requestFocus />**
 </EditText>


//Remove  **<requestFocus />** from xml