android - गतिविधि स्टार्टअप पर फ़ोकस प्राप्त करने से EditText को रोकें




listview android-edittext (20)

मेरे पास दो तत्वों के साथ एंड्रॉइड में एक Activity है:

  1. EditText
  2. ListView

जब मेरी Activity शुरू होती है, तो EditText तुरंत इनपुट फ़ोकस होता है (कर्सर चमकती है)। मैं स्टार्टअप पर इनपुट फोकस रखने के लिए कोई नियंत्रण नहीं चाहता हूं। मैंने कोशिश की:

EditText.setSelected(false);

कोई भाग्य नहीं। जब Activity शुरू होती है तो मैं खुद को चुनने के लिए EditText को कैसे समझा सकता हूं?


अन्य पोस्टर्स द्वारा प्रदान की गई जानकारी का उपयोग करके, मैंने निम्नलिखित समाधान का उपयोग किया:

लेआउट एक्सएमएल में

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

ऑनक्रेट () में

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

और अंत में, रेस्यूम () में

@Override
protected void onResume() {
    super.onResume();

    //do not give the editbox focus automatically when activity starts
    mAutoCompleteTextView.clearFocus();
    mLinearLayout.requestFocus();
}

अपनी गतिविधि के clearFocus() पर, बस अपने EditText तत्व पर clearFocus() उपयोग करें। उदाहरण के लिए,

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

और यदि आप किसी अन्य तत्व पर फ़ोकस को हटाना चाहते हैं, तो उस पर requestFocus() उपयोग करें। उदाहरण के लिए,

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

आप लेआउट चौड़ाई और ऊंचाई 0 0dp सेट के साथ एक डमी 0dp बनाकर प्राप्त कर सकते हैं, और उस दृश्य पर फ़ोकस का अनुरोध कर सकते हैं। अपने एक्सएमएल लेआउट में निम्न कोड स्निपेट जोड़ें:

<EditText
    android:id="@+id/editText0"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:hint="@string/dummy"
    android:ems="10" 
    >
     <requestFocus />
    </EditText>

इनमें से कोई भी समाधान मेरे लिए काम नहीं करता है। जिस तरह से मैंने ऑटोफोकस को ठीक किया था:

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

इस लाइन को अपने माता-पिता लेआउट में लिखें ...

 android:focusableInTouchMode="true"

एक आसान समाधान मौजूद है। इन गुणों को अपने मूल लेआउट में सेट करें:

<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 पेरोट से अच्छी टिप्पणी :

android:descendantFocusability="beforeDescendants" डिफ़ॉल्ट प्रतीत होता है (पूर्णांक मान 0 है)। यह सिर्फ android:focusableInTouchMode="true" जोड़कर काम करता है android:focusableInTouchMode="true"

असल में, हम देख सकते हैं कि पहले beforeDescendants ViewGroup.initViewGroup() विधि (एंड्रॉइड 2.2.2) में डिफ़ॉल्ट के रूप में सेट है। लेकिन 0 के बराबर नहीं। ViewGroup.FOCUS_BEFORE_DESCENDANTS = 0x20000;

Guillaume के लिए धन्यवाद।


क्या वास्तविक समस्या यह है कि आप इसे बिल्कुल ध्यान केंद्रित नहीं करना चाहते हैं? या आप EditText को फोकस करने के परिणामस्वरूप वर्चुअल कीबोर्ड नहीं दिखाना चाहते हैं? मुझे वास्तव में संपादन पर फोकस करने वाले एडिटटेक्स्ट के साथ कोई समस्या नहीं दिखाई दे रही है, लेकिन जब निश्चित रूप से उपयोगकर्ता ने संपादन टेक्स्ट पर ध्यान केंद्रित करने का अनुरोध नहीं किया है (और परिणामस्वरूप कीबोर्ड खोलें) तो सॉफ्टबूट विंडो खोलने में यह समस्या है।

यदि यह वर्चुअल कीबोर्ड की समस्या है, तो AndroidManifest.xml <गतिविधि> तत्व दस्तावेज़ देखें।

android:windowSoftInputMode="stateHidden" - गतिविधि दर्ज करते समय हमेशा इसे छुपाएं।

या android:windowSoftInputMode="stateUnchanged" - इसे परिवर्तित न करें (उदाहरण के लिए इसे पहले से नहीं दिखाया गया है, लेकिन यदि गतिविधि में प्रवेश करते समय यह खुला था, तो इसे खोलें)।


देर हो चुकी है, लेकिन शायद मददगार। अपने लेआउट के शीर्ष पर एक डमी myDummyEditText.requestFocus() फिर myDummyEditText.requestFocus() को कॉल करें onCreate()

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

ऐसा लगता है कि मैं व्यवहार करता हूं। कॉन्फ़िगरेशन परिवर्तनों को संभालने की कोई ज़रूरत नहीं है, आदि। मुझे इसे एक गतिविधि के लिए एक लंबे टेक्स्टव्यू (निर्देश) के साथ चाहिए।


मुझे प्रोग्रामेटिक रूप से सभी क्षेत्रों से फोकस साफ़ करने की आवश्यकता थी। मैंने अभी अपनी मुख्य लेआउट परिभाषा में निम्नलिखित दो कथन जोड़े हैं।

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

बस। तुरंत मेरी समस्या फिक्स्ड। धन्यवाद, सिल्वर, मुझे सही दिशा में इंगित करने के लिए।


मुझे मिला एकमात्र समाधान है:

  • एक LinearLayout बनाएँ (मुझे पता नहीं है कि अन्य प्रकार के लेआउट काम करेंगे)
  • विशेषताएँ android:focusable="true" सेट करें android:focusable="true" और android:focusableInTouchMode="true"

और गतिविधि शुरू करने के बाद EditText को फोकस नहीं मिलेगा


मैंने व्यक्तिगत रूप से कई उत्तरों की कोशिश की थी लेकिन फोकस अभी भी एडिटटेक्स्ट पर है। मैंने केवल नीचे दिए गए दो समाधानों का उपयोग करके इसे हल करने में कामयाब रहे।

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/mainLayout"
  android:descendantFocusability="beforeDescendants"
  android:focusableInTouchMode="true" >

(सिल्वर https://.com/a/8639921/15695 से संदर्भ)

और हटा दें

 <requestFocus />

EditText पर

(Floydaddict share से संदर्भ)


यदि आपके पास ListView जैसी आपकी गतिविधि पर एक और ListView , तो आप यह भी कर सकते हैं:

ListView.requestFocus(); 

onResume() से फोकस करने के लिए अपने onResume()

मुझे पता है कि इस सवाल का उत्तर दिया गया है, लेकिन सिर्फ एक वैकल्पिक समाधान प्रदान करना जो मेरे लिए काम करता है :)


ल्यूक और मार्क से उत्कृष्ट जवाब हालांकि एक अच्छा कोड नमूना गुम है। टैग android:focusableInTouchMode="true" जोड़ना android:focusableInTouchMode="true" <LinearLayout> android:focusableInTouchMode="true" निम्न उदाहरण की तरह समस्या को ठीक करेगा।

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

सबसे सरल बात यह है कि मैंने दूसरे दृश्य पर फ़ोकस सेट करना है:

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

इसने नरम कीबोर्ड को चालू कर दिया और संपादन टेक्स्ट में कोई कर्सर चमक नहीं रहा।


सरल जवाब, बस इसे एक्सएमएल के पैरेंट लेआउट में जोड़ें।

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

सरल समाधान: Activity टैग उपयोग में AndroidManifest में

android:windowSoftInputMode="stateAlwaysHidden"

Manifest में मेरे लिए निम्नलिखित काम किया। लिखो ,

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

android:windowSoftInputMode="stateAlwaysHidden" जोड़ें android:windowSoftInputMode="stateAlwaysHidden" Manifest.xml फ़ाइल के गतिविधि टैग में।

Source


onCreate विधि में निम्नलिखित जोड़ें:

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

setSelected(false) बजाय clearFocus() आज़माएं। एंड्रॉइड में प्रत्येक दृश्य में फोकसशीलता और चयनशीलता दोनों होती है, और मुझे लगता है कि आप केवल फोकस को साफ़ करना चाहते हैं।







android-edittext