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




listview android-edittext (24)

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

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

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

  1. EditText
  2. ListView

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

EditText.setSelected(false);

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


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

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

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

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

हाँ मैंने वही काम किया - एक 'डमी' रैखिक लेआउट बनाएं जो प्रारंभिक फोकस प्राप्त करता है। इसके अलावा, मैंने 'अगली' फोकस आईडी सेट की है ताकि उपयोगकर्ता एक बार स्क्रॉल करने के बाद इसे और अधिक ध्यान केंद्रित नहीं कर सके:

<LinearLayout 'dummy'>
<EditText et>

dummy.setNextFocusDownId(et.getId());

dummy.setNextFocusUpId(et.getId());

et.setNextFocusUpId(et.getId());

एक दृश्य पर ध्यान केंद्रित करने के लिए बस बहुत काम ..

धन्यवाद


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

 android:focusableInTouchMode="true"

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


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

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

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

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


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

<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 के लिए धन्यवाद।


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

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

  • एक 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 से संदर्भ)


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

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

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


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

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

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

मेरे लिए, सभी उपकरणों पर क्या काम किया यह है:

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

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


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

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

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

Source


निम्नलिखित बनाए जाने पर फोकस लेने से एडिटेक्स्ट को रोक दिया जाएगा, लेकिन जब आप उन्हें स्पर्श करेंगे तो इसे पकड़ लें।

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

क्योंकि आप झूठी वापसी कर रहे हैं, यानी घटना का उपभोग नहीं कर रहे हैं, ध्यान केंद्रित व्यवहार सामान्य की तरह आगे बढ़ेगा।


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

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

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


समस्या ऐसी संपत्ति से आती है जो मैं केवल लेआउट के 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>

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

android:windowSoftInputMode="stateAlwaysHidden"

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

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

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

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

ल्यूक और मार्क से उत्कृष्ट जवाब हालांकि एक अच्छा कोड नमूना गुम है। टैग 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"/>

ऐसा होने के नाते मैं एक्सएमएल को कार्यक्षमता से संबंधित किसी चीज़ के साथ प्रदूषित नहीं करना चाहता, मैंने इस विधि को बनाया कि "पारदर्शी रूप से" पहले फोकस करने योग्य दृश्य से फोकस चुरा लेता है और फिर आवश्यक होने पर स्वयं को हटाना सुनिश्चित करता है!

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

यह एकदम सही और सबसे आसान समाधान है। मैं हमेशा अपने ऐप में इसका उपयोग करता हूं।

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);






android-edittext