मेरे पास Android में एक Activity
है, जिसमें दो तत्व हैं:
EditText
ListView
जब मेरा Activity
शुरू होता है, तो EditText
में तुरंत इनपुट फोकस (चमकता कर्सर) होता है। मैं नहीं चाहता कि कोई नियंत्रण स्टार्टअप पर इनपुट फोकस करे। मैंने कोशिश की:
EditText.setSelected(false);
EditText.setFocusable(false);
कोई भाग्य नहीं। Activity
के प्रारंभ होने पर मैं EditText
को स्वयं का चयन न करने के लिए कैसे मना सकता हूं?
28 जवाब
ल्यूक और मार्क से उत्कृष्ट उत्तर। हालांकि, एक अच्छा कोड नमूना गुम है। निम्नलिखित उदाहरण में टैग android:focusableInTouchMode="true"
और android:focusable="true"
को पैरेंट लेआउट (जैसे LinearLayout
या ConstraintLayout
) में जोड़ने से समस्या ठीक हो जाएगी।
<!-- 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"/>
क्या वास्तविक समस्या यह है कि आप नहीं चाहते कि इस पर बिल्कुल भी ध्यान दिया जाए? या आप नहीं चाहते कि यह EditText
पर ध्यान केंद्रित करने के परिणामस्वरूप वर्चुअल कीबोर्ड दिखाए? मुझे वास्तव में EditText
की शुरुआत पर ध्यान केंद्रित करने में कोई समस्या नहीं दिखाई दे रही है, लेकिन जब उपयोगकर्ता ने स्पष्ट रूप से EditText
पर ध्यान केंद्रित करने का अनुरोध नहीं किया, तो सॉफ्टइनपुट विंडो खुला होना निश्चित रूप से एक समस्या है। और परिणामस्वरूप कीबोर्ड खोलें)।
अगर यह वर्चुअल कीबोर्ड की समस्या है, तो AndroidManifest.xml
<गतिविधि> तत्व दस्तावेज़ीकरण।
android:windowSoftInputMode="stateHidden"
- गतिविधि में प्रवेश करते समय इसे हमेशा छिपाएं।
या android:windowSoftInputMode="stateUnchanged"
- इसे न बदलें (उदाहरण के लिए, इसे दिखाएं अगर यह पहले से नहीं दिखाया गया है, लेकिन अगर यह गतिविधि में प्रवेश करते समय खुला था, तो इसे खुला छोड़ दें)।
EditText
को फोकस प्राप्त करने से रोकेगा। यह वास्तव में स्पष्ट रूप से बताता है कि इस प्रकार आप सॉफ़्टवेयर कीबोर्ड IME को फ़ोकस पर अपने आप खुलने से रोकते हैं; क्योंकि यह अधिक संभावना है कि बड़ी चिंता यह है कि सॉफ्ट कीबोर्ड अप्रत्याशित रूप से पॉप अप हो रहा है, फोकस स्वयं नहीं है। यदि आपकी समस्या EditText
वास्तव में बिल्कुल ध्यान केंद्रित करने के साथ है, तो किसी और के उत्तर का उपयोग करें।
एक आसान समाधान मौजूद है। इन विशेषताओं को अपने पैरेंट लेआउट में सेट करें:
<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();
अच्छी टिप्पणी Guillaume Perrot से:
android:descendantFocusability="beforeDescendants"
ऐसा प्रतीत होता है डिफ़ॉल्ट (पूर्णांक मान 0 है)। यह सिर्फ जोड़कर काम करता हैandroid:focusableInTouchMode="true"
.
वास्तव में, हम देख सकते हैं कि beforeDescendants
ViewGroup.initViewGroup()
विधि (एंड्रॉइड 2.2.2) में डिफ़ॉल्ट के रूप में सेट है। लेकिन 0 के बराबर नहीं। ViewGroup.FOCUS_BEFORE_DESCENDANTS = 0x20000;
गिलौम को धन्यवाद।
मुझे मिला एकमात्र समाधान है:
- एक LinearLayout बनाएं (मुझे नहीं पता कि अन्य प्रकार के लेआउट की वसीयत है या नहीं काम)
android:focusable="true"
औरandroid:focusableInTouchMode="true"
एट्रिब्यूट सेट करें
और गतिविधि शुरू करने के बाद EditText
को फोकस नहीं मिलेगा
ऐसा लगता है कि समस्या किसी संपत्ति से आई है जिसे मैं केवल लेआउट के XML form
में देख सकता हूं।
घोषणा के अंत में EditText
XML टैग के भीतर इस लाइन को हटाना सुनिश्चित करें:
<requestFocus />
ऐसा कुछ देना चाहिए:
<EditText
android:id="@+id/emailField"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="textEmailAddress">
//<requestFocus /> /* <-- without this line */
</EditText>
निम्नलिखित संपादन टेक्स्ट को बनाए जाने पर फ़ोकस लेने से रोक देगा, लेकिन जब आप उन्हें स्पर्श करेंगे तो उसे पकड़ लेंगे।
<EditText
android:id="@+id/et_bonus_custom"
android:focusable="false" />
तो आप xml में फ़ोकस करने योग्य सेट करते हैं, लेकिन कुंजी जावा में है, जिसे आप निम्नलिखित श्रोता जोड़ते हैं:
etBonus.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
v.setFocusable(true);
v.setFocusableInTouchMode(true);
return false;
}
});
क्योंकि आप झूठी वापसी कर रहे हैं, यानी घटना का उपभोग नहीं कर रहे हैं, ध्यान केंद्रित करने वाला व्यवहार सामान्य की तरह आगे बढ़ेगा।
मैंने व्यक्तिगत रूप से कई उत्तरों की कोशिश की थी लेकिन फोकस अभी भी एडिटटेक्स्ट पर है। मैं केवल नीचे दिए गए दो समाधानों का एक साथ उपयोग करके इसे हल करने में कामयाब रहा।
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mainLayout"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true" >
(सिल्वर https://stackoverflow.com/a/8639921/15695 से संदर्भ)
और हटाओ
<requestFocus />
एडिटटेक्स्ट पर
(फ्लोयडैडिक्ट से संदर्भ https://stackoverflow.com/a/9681809 )
देर से लेकिन सरल उत्तर, बस इसे एक्सएमएल के मूल लेआउट में जोड़ें।
android:focusable="true"
android:focusableInTouchMode="true"
अपवोट करें अगर इसने आपकी मदद की! हैप्पी कोडिंग :)
इनमें से किसी भी समाधान ने मेरे लिए काम नहीं किया। जिस तरह से मैंने ऑटोफोकस को ठीक किया वह था:
<activity android:name=".android.InviteFriendsActivity" android:windowSoftInputMode="adjustPan">
<intent-filter >
</intent-filter>
</activity>
सरल उपाय: AndroidManifest
में Activity
में टैग का उपयोग करें
android:windowSoftInputMode="stateAlwaysHidden"
आप बस layout
के पहले TextView
पर "फोकस करने योग्य" और "फोकसेबल इन टच मोड" को सही मान पर सेट कर सकते हैं। इस तरह जब गतिविधि शुरू होगी TextView
पर ध्यान केंद्रित किया जाएगा, लेकिन इसकी प्रकृति के कारण, आपको स्क्रीन पर कुछ भी केंद्रित नहीं दिखाई देगा और निश्चित रूप से, कोई नहीं कीबोर्ड प्रदर्शित होगा। ..
निम्नलिखित ने मेरे लिए Manifest
में काम किया। लिखना ,
<activity
android:name=".MyActivity"
android:windowSoftInputMode="stateAlwaysHidden"/>
मुझे प्रोग्रामेटिक रूप से सभी क्षेत्रों से ध्यान हटाने की जरूरत है। मैंने अपनी मुख्य लेआउट परिभाषा में अभी निम्नलिखित दो कथन जोड़े हैं।
myLayout.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
myLayout.setFocusableInTouchMode(true);
बस, इतना ही। मेरी समस्या का तुरंत समाधान किया। धन्यवाद, रजत, मुझे सही दिशा में इंगित करने के लिए।
Manifest.xml
फ़ाइल के गतिविधि टैग में android:windowSoftInputMode="stateAlwaysHidden"
जोड़ें।
यदि आप अपनी गतिविधि के बारे में ListView
जैसी अन्य दृष्टि रखते हैं, तो आप यह भी कर सकते हैं:
ListView.requestFocus();
अपने onResume()
में editText
से ध्यान खींचने के लिए।
मुझे पता है कि इस प्रश्न का उत्तर दिया गया है लेकिन सिर्फ एक वैकल्पिक समाधान प्रदान करना जो मेरे लिए काम करता है :)
अपने पहले संपादन योग्य क्षेत्र से पहले इसे आजमाएं:
<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();
onCreate
विधि में निम्नलिखित जोड़ें:
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
ऐसा होने के कारण मैं एक्सएमएल को कार्यक्षमता से संबंधित किसी चीज़ से प्रदूषित नहीं करना चाहता, मैंने यह विधि बनाई है कि "पारदर्शी रूप से" पहले फोकस करने योग्य दृश्य से फोकस चुरा लेता है और फिर आवश्यक होने पर खुद को हटाना सुनिश्चित करता है!
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;
}
इस लाइन को अपने पैरेंट लेआउट में लिखें...
android:focusableInTouchMode="true"
देर से, लेकिन शायद मददगार। अपने लेआउट के शीर्ष पर एक डमी संपादन टेक्स्ट बनाएं और फिर myDummyEditText.requestFocus()
को onCreate()
में कॉल करें
<EditText android:id="@+id/dummyEditTextFocus"
android:layout_width="0px"
android:layout_height="0px" />
ऐसा लगता है कि जैसा मैं उम्मीद करता हूं वैसा व्यवहार करता हूं। कॉन्फ़िगरेशन परिवर्तन आदि को संभालने की कोई आवश्यकता नहीं है। मुझे एक लंबी टेक्स्ट व्यू (निर्देश) वाली गतिविधि के लिए इसकी आवश्यकता है।
हाँ मैंने वही किया - एक 'डमी' रैखिक लेआउट बनाएं जो प्रारंभिक फोकस प्राप्त करे। इसके अलावा, मैं 'अगला' फोकस आईडी सेट करता हूं ताकि उपयोगकर्ता एक बार स्क्रॉल करने के बाद इसे और अधिक केंद्रित न कर सके:
<LinearLayout 'dummy'>
<EditText et>
dummy.setNextFocusDownId(et.getId());
dummy.setNextFocusUpId(et.getId());
et.setNextFocusUpId(et.getId());
एक दृश्य पर ध्यान केंद्रित करने से छुटकारा पाने के लिए बहुत काम ..
धन्यवाद
मेरे लिए, सभी उपकरणों पर जो काम करता है वह यह है:
<!-- 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/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"/>
मैंने जो सबसे आसान काम किया वह है ऑनक्रिएट में किसी अन्य दृश्य पर ध्यान केंद्रित करना:
myView.setFocusableInTouchMode(true);
myView.requestFocus();
इसने सॉफ्ट कीबोर्ड को ऊपर आना बंद कर दिया और एडिटटेक्स्ट में कोई कर्सर नहीं चमक रहा था।
यह एकदम सही और सबसे आसान उपाय है। मैं हमेशा अपने ऐप में इसका इस्तेमाल करता हूं।
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
इस कोड को 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
पर, बस अपने EditText तत्व पर उपयोग clearFocus()
जोड़ें। उदाहरण के लिए,
edittext = (EditText) findViewById(R.id.edittext);
edittext.clearFocus();
और यदि आप किसी अन्य तत्व पर ध्यान केंद्रित करना चाहते हैं, तो उस पर requestFocus()
का उपयोग करें। उदाहरण के लिए,
button = (Button) findViewById(R.id.button);
button.requestFocus();
कीबोर्ड को छिपाने का सबसे आसान तरीका है setSoftInputMode का उपयोग करना
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
या आप InputMethodManager का उपयोग कर सकते हैं और इस तरह कीबोर्ड छुपा सकते हैं।
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);
संबंधित सवाल
नए सवाल
android
एंड्रॉइड Google का मोबाइल ऑपरेटिंग सिस्टम है, जिसका उपयोग प्रोग्रामिंग या डिजिटल डिवाइस (स्मार्टफोन, टैबलेट, ऑटोमोबाइल्स, टीवी, वियर, ग्लास, IoT) को विकसित करने के लिए किया जाता है। एंड्रॉइड से संबंधित विषयों के लिए, एंड्रॉइड-विशिष्ट टैग जैसे कि एंड्रॉइड-इरादे, एंड्रॉइड-गतिविधि, एंड्रॉइड-एडॉप्टर आदि का उपयोग करें। विकास या प्रोग्रामिंग के अलावा अन्य प्रश्नों के लिए, लेकिन एंड्रॉइड फ्रेमवर्क से संबंधित हैं, इस लिंक का उपयोग करें: https: // android.stackexchange.com।
android:focusableInTouchMode="true"
पर सेट करने के बारे में क्या?