android - يساعد - نصائح لتقوية التركيز اثناء المذاكرة
إيقاف EditText من الحصول على التركيز عند بدء النشاط (20)
أبسط الإجابة ، فقط قم بإضافة هذا في تخطيط أصل XML.
android:focusable="true"
android:focusableInTouchMode="true"
لدي Activity
في Android ، مع عنصرين:
-
EditText
-
ListView
عندما يبدأ " EditText
" ، يكون EditText
فورًا EditText
على الإدخال (مؤشر وامض). لا أريد أي عنصر تحكم أن يكون التركيز على الإدخال عند بدء التشغيل. حاولت:
EditText.setSelected(false);
لا حظ. كيف يمكنني إقناع EditText
بعدم تحديد نفسه عند بدء Activity
؟
أبسط شيء فعلته هو التركيز على وجهة نظر أخرى في onCreate:
myView.setFocusableInTouchMode(true);
myView.requestFocus();
هذا توقف لوحة المفاتيح الناعمة القادمة وليس هناك مؤشر وامض في EditText.
أضف android:windowSoftInputMode="stateAlwaysHidden"
في علامة النشاط الخاصة بملف Manifest.xml
.
إذا كان لديك عرض آخر على نشاطك مثل 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;
شكرا لجيليوم.