android - يساعد - نصائح لتقوية التركيز اثناء المذاكرة




إيقاف EditText من الحصول على التركيز عند بدء النشاط (20)

أبسط الإجابة ، فقط قم بإضافة هذا في تخطيط أصل XML.

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

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

  1. EditText
  2. ListView

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

EditText.setSelected(false);

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


أبسط شيء فعلته هو التركيز على وجهة نظر أخرى في onCreate:

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

هذا توقف لوحة المفاتيح الناعمة القادمة وليس هناك مؤشر وامض في EditText.


أضف android:windowSoftInputMode="stateAlwaysHidden" في علامة النشاط الخاصة بملف Manifest.xml .

Source


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

ListView.requestFocus(); 

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

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


اكتب هذا الخط في تخطيط الوالدين ...

 android:focusableInTouchMode="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>

باستخدام المعلومات التي قدمتها الملصقات الأخرى ، استخدمت الحل التالي:

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

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

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

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


جرب هذا قبل أول حقل قابل للتعديل:

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

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


سوف يوقف ما يلي edittext من التركيز عند إنشائه ، ولكن الاستيلاء عليه عند لمسها.

<EditText
    android:id="@+id/et_bonus_custom"
    android:focusable="false" />

لذا يمكنك ضبطها على 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 ، بمعنى أنه لا يستهلك الحدث ، فإن سلوك التركيز سوف يستمر كالمعتاد.


عملت التالية بالنسبة لي في Manifest . كتابة ،

<activity
android:name=".MyActivity"
android:windowSoftInputMode="stateAlwaysHidden"/>

في وقت متأخر ، ولكن ربما مفيد. إنشاء EditText زائف في أعلى تخطيطك ثم استدعاء myDummyEditText.requestFocus() في onCreate()

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

يبدو أن تتصرف كما أتوقع. لا حاجة للتعامل مع تغييرات التكوين ، وما إلى ذلك كنت بحاجة إلى هذا للنشاط مع TextView (تعليمات) مطولة.


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

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

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


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

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

نعم فعلت الشيء نفسه - إنشاء تخطيط خطي "وهمية" الذي يحصل على التركيز الأولي. علاوة على ذلك ، أقوم بتعيين معرفات التركيز "التالية" بحيث لا يمكن للمستخدم التركيز عليها بعد التمرير مرة واحدة:

<LinearLayout 'dummy'>
<EditText et>

dummy.setNextFocusDownId(et.getId());

dummy.setNextFocusUpId(et.getId());

et.setNextFocusUpId(et.getId());

الكثير من العمل فقط للتخلص من التركيز على وجهة نظر ..

شكر


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

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

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

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


يبدو أن المشكلة تأتي من خاصية لا يمكنني رؤيتها إلا في XML form للتخطيط.

تأكد من إزالة هذا السطر في نهاية التعريف ضمن EditText 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>

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


يوجد حل أبسط. عيّن هذه السمات في تخطيطك الرئيسي:

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

شكرا لجيليوم.





android-edittext