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



Answers

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

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

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

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

Question

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

  1. EditText
  2. ListView

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

EditText.setSelected(false);

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




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

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

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




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



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

ListView.requestFocus(); 

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

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




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

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



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

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



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

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



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

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

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




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




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

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

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

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



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



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

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

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




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

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

   <requestFocus /> <!-- remove this line --> 
</EditText>



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




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

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



Related