it-swarm.com.ru

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

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

  1. EditText 
  2. ListView

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

EditText.setSelected(false);

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

2581
Mark

Отличные ответы от Люка и Марка, однако хороший пример кода отсутствует. Добавление тега Android:focusableInTouchMode="true" в <LinearLayout>, как показано в следующем примере, решит проблему.

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

<!-- :nextFocusUp and :nextFocusLeft have been set to the id of this component
to prevent the dummy from receiving focus again -->
<AutoCompleteTextView Android:id="@+id/autotext"
    Android:layout_width="fill_parent" 
    Android:layout_height="wrap_content"
    Android:nextFocusUp="@id/autotext" 
    Android:nextFocusLeft="@id/autotext"/>
2265
Morgan Christiansson

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

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

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

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

1605
Joe

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

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

Хороший комментарий из Гийом Перро :

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

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

Спасибо Гийому.

1060
Silver

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

  • Создать LinearLayout (Я не знаю, будут ли работать другие виды макетов)
  • Установите атрибуты Android:focusable="true" и Android:focusableInTouchMode="true"

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

403
Luc

Кажется, проблема связана со свойством, которое я вижу только в XML form макета.

Обязательно удалите эту строку в конце объявления внутри тегов 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>
73
floydaddict

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

в макете 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"/>

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

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

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

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

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

63
Konklone

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

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

63
MinceMan

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

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

(Ссылка от Silver https://stackoverflow.com/a/8639921/15695 )

и удалить

 <requestFocus />

на EditText 

(Ссылка от floydaddict https://stackoverflow.com/a/9681809 )

50
Lee Yi Hong

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

<activity Android:name=".Android.InviteFriendsActivity" Android:windowSoftInputMode="adjustPan">
    <intent-filter >
    </intent-filter>
</activity>
40
rallat

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

Android:windowSoftInputMode="stateAlwaysHidden"
37
Sergey Sheleg

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

32
Zeus

Следующее работает для меня в Manifest. Написать ,

<activity
Android:name=".MyActivity"
Android:windowSoftInputMode="stateAlwaysHidden"/>
31
Babar Sanah

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

Android:focusable="true" 
Android:focusableInTouchMode="true"
28
Rishabh Saxena

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

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

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

26
jakeneff

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

Источник

24
prgmrDev

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

ListView.requestFocus(); 

в вашей onResume(), чтобы получить фокус от editText.

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

19
Sid

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

<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();
18
Jack Slater

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

this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
18
Vishal Raj

Поскольку я не люблю загрязнять 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;
}
14
Takhion

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

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

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

13
Jim

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

 Android:focusableInTouchMode="true"
12
Vishal Vaishnav

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

<LinearLayout 'dummy'>
<EditText et>

dummy.setNextFocusDownId(et.getId());

dummy.setNextFocusUpId(et.getId());

et.setNextFocusUpId(et.getId());

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

Спасибо

12
mark

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

    <!-- 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" />

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

10
android developer

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

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

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

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

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

8
Lumis
<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"/>
7
atul

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

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

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

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

button = (Button) findViewById(R.id.button);
button.requestFocus();
6
Compaq LE2202x

Самый простой способ скрыть клавиатуру - использовать setSoftInputMode 

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

или вы можете использовать InputMethodManager и скрыть клавиатуру, как это.

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);
6
Anonymous

Когда ваша деятельность открыта, клавиатура автоматически становится видимой, что вызывает фокусировку EditText. Вы можете отключить клавиатуру, написав следующую строку в теге активности в файле manifest.xml.

 Android:windowSoftInputMode="stateAlwaysHidden|adjustPan"
6
Mansuu....

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

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

Обязательно удалите строку "<requestFocus />" из тега EditText в xml.

<EditText
   Android:id="@+id/input"
   Android:layout_width="fill_parent"
   Android:layout_height="wrap_content">

   <requestFocus /> <!-- remove this line --> 
</EditText>
6
Muhammad Aamir Ali

Я использую следующий код, чтобы не дать EditText украсть фокус при нажатии моей кнопки.

addButton.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        View focused = internalWrapper.getFocusedChild();
        focused.setVisibility(GONE);
        v.requestFocus();
        addPanel();
        focused.setVisibility(VISIBLE);
    }
});

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

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

5
drei01
/** 
 * set focus to top level window
 * disposes descendant focus 
 * disposes softInput 
 * */
public static void topLevelFocus(Context context){
    if(Activity.class.isAssignableFrom(context.getClass())){
        ViewGroup tlView = (ViewGroup) ((Activity) context).getWindow().getDecorView();
        if(tlView!=null){
            tlView.setFocusable(true);
            tlView.setFocusableInTouchMode(true);
            tlView.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
        }
    }
}
4
ceph3us
View current = getCurrentFocus();

if (current != null) 
    current.clearFocus();
4
DkPathak

Самый простой способ - добавить Android:windowSoftInputMode="stateAlwaysHidden" в тег активности файла Manifest.xml

3
Karthik

EditText внутри ListView не работает должным образом. Лучше использовать TableLayout с автоматически генерируемыми строками, когда вы используете EditText.

3
MSIslam

пытаться

edit.setInputType(InputType.TYPE_NULL);

edit.setEnabled(false);
3
Albert Oclarit

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

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">


<item Android:drawable="@drawable/text_field_disabled" Android:state_enabled="false"/>
<item Android:drawable="@drawable/text_field_focused" Android:state_focused="true"/>
<item Android:drawable="@drawable/text_field_normal"/>

2
j2emanue
<EditText
    Android:layout_width="match_parent"
    Android:layout_height="100dp"
    Android:id="@+id/etComments"
    Android:hint="Comments.."
    Android:textSize="14dp"

    Android:focusable="false"

    Android:textStyle="italic"/>
2
Mahmudul Haque Khan

Отключите его в onCreate ()

final KeyListener edtTxtMessageKeyListener = edtTxtMessage.getKeyListener();
edtTxtMessage.setCursorVisible(false);
edtTxtMessage.setKeyListener(null);

И, наконец, включите его в onClick () EditText

edtTxtMessage.setCursorVisible(true);
edtTxtMessage.setKeyListener(edtTxtMessageKeyListener);

Но проблема в том, что мы должны щелкнуть по кругу, чтобы вывести OnScreenKeyboard в самый первый раз.

@Workaround

InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);

Попробуйте это также в onClick () :)

2
Amit Yadav

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

2
Mary's

remove<requestFocus /> из вашего редактируемого текста в xml файле

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

   //`<requestFocus />` /* <-- remove this tags */
</EditText>`
2
Akshay Paliwal

Сделай это и сделай свою работу!

Android:focusable="true"
Android:focusableInTouchMode="true" 
2
Tulsi

У вас есть редактировать текст и список. В OnStart/On Create вы должны сфокусироваться на представлении списка: Listview.requestfocus()

1
hassan mirza

Если вы хотите спрятать клавиатуру в начале упражнения. Тогда упомяните

Android: windowSoftInputMode = "stateHidden"

Для этого действия в файле манифеста. Проблема решается.

Приветствия.

0
Rohit Patil

добавьте строку ниже в файл манифеста, где вы упомянули свою деятельность

Android:windowSoftInputMode="stateAlwaysHidden"
0
Akash Suresh Dandwate

Это может быть достигнуто путем наследования EditText и переопределения onTouchEvent.

class NonFocusableEditText: EditText {

    constructor(context: Context): super(context)
    constructor(context: Context, attrs: AttributeSet?): super(context, attrs)
    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int): super(context, attrs, defStyleAttr)

    override fun onTouchEvent(event: MotionEvent?): Boolean {
        return if (isFocusable) super.onTouchEvent(event) else false
    }
}

Затем вы можете использовать его в макетах, как обычно EditText:

<com.yourpackage.NonFocusableEditText
        Android:id="@+id/editText"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"    
        Android:hint="@string/your_hint"
        Android:imeOptions="actionDone"
        Android:inputType="textNoSuggestions" />
0
mmBs