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





15 Answers

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

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

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

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

android listview android-edittext

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

  1. EditText
  2. ListView

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

EditText.setSelected(false);

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




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

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

और गतिविधि शुरू करने के बाद 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();
}



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




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

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



layout के पहले TextView पर आप सही TextView के लिए बस "फोकस करने योग्य" और "टच मोड में फोकस करने योग्य " सेट कर सकते हैं। इस तरह जब गतिविधि शुरू होती है तो TextView ध्यान केंद्रित किया जाएगा, लेकिन इसकी प्रकृति के कारण, आप स्क्रीन पर ध्यान केंद्रित नहीं करेंगे और, ज़ाहिर है, कोई कीबोर्ड प्रदर्शित नहीं होगा ...




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

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

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




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

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



देर हो चुकी है, लेकिन शायद मददगार। अपने लेआउट के शीर्ष पर एक डमी myDummyEditText.requestFocus() फिर 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" />

समस्याग्रस्त केंद्रित दृश्य से पहले इसे एक दृश्य के रूप में रखें, और यही वह है।




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

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

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




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



आप लेआउट चौड़ाई और ऊंचाई 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>



Related