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


Answers

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

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

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

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

Question

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

  1. EditText
  2. ListView

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

EditText.setSelected(false);

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




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

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



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

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



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

ListView.requestFocus(); 

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

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




Xml में EditText टैग से "<requestFocus />" पंक्ति को निकालना सुनिश्चित करें।

<EditText
   android:id="@+id/input"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content">

   <requestFocus /> <!-- remove this line --> 
</EditText>



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

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

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

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



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

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

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




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




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




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

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



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

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



इस कोड को उस Activity में Manifest फ़ाइल के अंदर लिखें जहां आप कीबोर्ड नहीं खोलना चाहते हैं।

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>



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

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

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



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

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

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






Related