[android] إيقاف EditText من الحصول على التركيز عند بدء النشاط



Answers

هل المشكلة الفعلية هي أنك لا تريد أن يكون لها تركيز على الإطلاق؟ أو أنك لا تريد أن تظهر لوحة المفاتيح الافتراضية كنتيجة لتركيز EditText ؟ لا أرى حقاً مشكلة في EditText مع التركيز على البداية ، ولكنها بالتأكيد مشكلة في فتح نافذة softInput عندما لا يطلب المستخدم بشكل صريح التركيز على EditText (وفتح لوحة المفاتيح كنتيجة).

إذا كانت مشكلة لوحة المفاتيح الظاهرية ، فراجع وثائق عنصر AndroidManifest.xml <activity> .

android:windowSoftInputMode="stateHidden" - android:windowSoftInputMode="stateHidden" دائمًا عند الدخول إلى النشاط.

أو android:windowSoftInputMode="stateUnchanged" - لا تغيره (على سبيل المثال ، لا تعرضه إذا لم يكن معروضًا بالفعل ، ولكن إذا كان مفتوحًا عند الدخول إلى النشاط ، فاتركه مفتوحًا).

Question

لدي Activity في Android ، مع عنصرين:

  1. EditText
  2. ListView

عندما يبدأ " EditText " ، يكون EditText فورًا EditText على الإدخال (مؤشر وامض). لا أريد أي عنصر تحكم أن يكون التركيز على الإدخال عند بدء التشغيل. حاولت:

EditText.setSelected(false);

لا حظ. كيف يمكنني إقناع EditText بعدم تحديد نفسه عند بدء Activity ؟




إضافة يتبع في طريقة onCreate :

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



هذا هو الحل الأمثل والأكثر سهولة. أستخدم هذا دائمًا في تطبيقي.

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



تأكد من إزالة السطر "<requestFocus />" من علامة EditText في xml.

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

   <requestFocus /> <!-- remove this line --> 
</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"/>

في 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();
}



اكتب هذا الرمز داخل ملف 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>



في onCreate من نشاطك ، ما عليك سوى إضافة clearFocus() على عنصر EditText الخاص بك. فمثلا،

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

وإذا كنت ترغب في تحويل التركيز إلى عنصر آخر ، استخدم requestFocus() على ذلك. فمثلا،

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



بالنسبة لي ، ما نجح على جميع الأجهزة هو:

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

فقط ضع هذا كطريقة عرض قبل العرض المركب المسبب للمشاكل ، وهذا كل شيء.




الحل الوحيد الذي وجدته هو:

  • إنشاء LinearLayout (أنا dunno إذا كانت ستعمل أنواع أخرى من تخطيط)
  • تعيين سمات android:focusable="true" و android:focusableInTouchMode="true"

ولن تحصل على EditText التركيز بعد بدء النشاط




كنت بحاجة إلى مسح التركيز من جميع المجالات برمجيا. لقد قمت للتو بإضافة البيانين التاليين إلى تعريف المخطط الرئيسي الخاص بي.

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

هذا هو. حل مشكلتي على الفور. شكرًا ، يا فضي ، لإشارتك في الاتجاه الصحيح.




إذا كان لديك عرض آخر على نشاطك مثل ListView ، فيمكنك أيضًا القيام بما يلي:

ListView.requestFocus(); 

في onResume() الخاص بك لانتزاع التركيز من editText .

أعلم أن هذا السؤال قد تم الإجابة عليه ولكن فقط توفير حل بديل يعمل بالنسبة لي :)




حاول clearFocus() بدلاً من setSelected(false) . تتمتع كل مشاهدة في Android بكل من إمكانية التركيز والقابلية للاختيار ، وأعتقد أنك تريد مسح التركيز فقط.




يمكنك فقط تعيين "focusable" و "focusable في وضع اللمس" قيمة حقيقية على TextView الأول layout . بهذه الطريقة عند بدء النشاط ، سيتم تركيز TextView ، ولكن نظرًا لطبيعته ، لن ترى أي شيء يركز على الشاشة ، وبالطبع لن تظهر لوحة مفاتيح ...




لم ينجح أي من هذه الحلول بالنسبة لي. الطريقة التي أصلح بها ضبط تلقائي للصورة كانت:

<activity android:name=".android.InviteFriendsActivity" android:windowSoftInputMode="adjustPan">
    <intent-filter >
    </intent-filter>
</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;
}



Links