जब एक लेआउट बनाया और प्रदर्शित किया जाता है तो एक दृश्य पर ध्यान कैसे सेट करें?


90

वर्तमान में, मेरे पास एक लेआउट है जिसमें एक Button, एक TextViewऔर एक है EditText। जब लेआउट प्रदर्शित किया जाता है, तो फोकस स्वचालित रूप से उस पर डाल दिया EditTextजाएगा, जो एंड्रॉइड फोन पर दिखाने के लिए कीबोर्ड को ट्रिगर करेगा। यह वह नहीं है जो मैं चाहता हूं। क्या ऐसा कोई तरीका है जिससे मैं TextViewकिसी लेआउट के प्रदर्शित होने पर या किसी और चीज़ पर ध्यान केंद्रित कर सकता हूँ ?

जवाबों:


109

फोकस सेट करें: उपयोगकर्ता इनपुट के जवाब में फ्रेमवर्क चल रहा है। किसी विशिष्ट दृश्य पर ध्यान केंद्रित करने के लिए, कॉल करें अनुरोध फ़ोकस ()


17

यह काम:

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

यह क्या करता है? ऐसा लगता है कि यह पूरी गतिविधि के लिए कुछ स्थिति को संशोधित कर रहा है, न कि केवल एक दृश्य या टुकड़ा, इसलिए मैं इस बारे में सतर्क रहूंगा, और इसका उपयोग नहीं करूंगा जब तक कि मैं इसके सभी निहितार्थों को नहीं समझता।
वड़ादि कार्तिक

वास्तव में मैं मूल पोस्टर के अनुरोध के आधार पर ऐसा नहीं करूंगा। यह वर्तमान समस्या को हल कर सकता है, लेकिन इसके उपयोग के दुष्प्रभाव हैं जो बाद में समस्याएं पैदा कर सकते हैं। यह इस तरह से हैक होता है जो कोड बेस में अपना रास्ता बनाता है जिसके कारण अन्य हैक को मूल हैक को नकारने के लिए बाद में जोड़ा जाता है..यह दुष्चक्र जारी है .... और लोगों को आश्चर्य होता है कि कोड क्यों अचूक हो जाता है। हां, आपने यह अनुमान लगाया .... मैं दूसरों के साथ काम करता हूं जो इस तरह से सामान करते हैं और यह मेरे जीवन को बहुत मुश्किल बना देता है।
dell116



6

फ़ोकस सेट करने के लिए, एक हैंडलर का उपयोग करके अनुरोध फ़ोकस () में देरी करें।

private Handler mHandler= new Handler();

public class HelloAndroid extends Activity {
   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.main);

     LinearLayout mainVw = (LinearLayout) findViewById(R.id.main_layout);

     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( 
           LinearLayout.LayoutParams.FILL_PARENT,
           LinearLayout.LayoutParams.WRAP_CONTENT);

     EditText edit = new EditText(this);
     edit.setLayoutParams(params);
     mainVw.addView(edit);

     TextView titleTv = new TextView(this);
     titleTv.setText("test");
     titleTv.setLayoutParams(params);
     mainVw.addView(titleTv);

     mHandler.post(
       new Runnable() 
       {
          public void run() 
          {
            titleTv.requestFocus();
          } 
       }
     );
   }
}

5

आप कीबोर्ड को छिपाने की कोशिश कर सकते हैं। कुछ इस तरह:

InputMethodManager inputManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);


3

इन लाइनों को भी सेट करें OnResumeऔर सुनिश्चित करें कि यदि focusableInTouchआप अपने नियंत्रणों को शुरू करते समय सही पर सेट हैं

<controlName>.requestFocus();

<controlName>.requestFocusFromTouch();

3

फोकस बदलने के लिए xml में टेक्स्ट व्यू को फोकस करने योग्य बनाएं

<TextView
            **android:focusable="true"**
            android:id="@+id/tv_id"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

और बनाने पर जावा में

textView.requestFocus();

या बस कीबोर्ड छिपाएँ

public void hideKeyBoard(Activity act) {
    act.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
    InputMethodManager imm = (InputMethodManager) act.getSystemService(Context.INPUT_METHOD_SERVICE);
}

Android: ध्यान देने योग्य = "सत्य" और textView.requestFocus (); मेरे लिए काम किया। धन्यवाद!
वर्नर

2

ऊपर दिए गए जवाबों में से कोई भी मेरे लिए काम नहीं करता है। एकमात्र (चलो कहते हैं) समाधान एक अक्षम EditText में पहले TextView को बदलने के लिए किया गया है जो फोकस प्राप्त करता है और फिर जोड़ देता है

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

में onCreate कुंजीपटल को रोकने के लिए कॉलबैक दिखाया जा सकता है। अब मेरा पहला EditText एक TextView की तरह दिखता है, लेकिन प्रारंभिक फोकस प्राप्त कर सकता है, अंत में।


2

अंतिम सुझाव सही समाधान है। बस दोहराने के लिए, पहले android:focusable="true"लेआउट xmlफ़ाइल में सेट करें , फिर requestFocus()अपने कोड में देखें।


1

मुझे लगता है कि एक पाठ दृश्य ध्यान देने योग्य नहीं है। उदाहरण के लिए एक बटन पर ध्यान केंद्रित करने की कोशिश करें या संपत्ति को सच करने के लिए ध्यान केंद्रित करने की कोशिश करें।


1

आप उर xml में पहले नियंत्रण के रूप में आकार "0 डिप" का एक संपादित पाठ जोड़ सकते हैं, इसलिए, यह रेंडर पर ध्यान केंद्रित करेगा। (सुनिश्चित करें कि इसका फ़ोकस करने योग्य और सभी ...)


1

आप फ़ाइल android:windowSoftInputModeमें अपनी गतिविधि को जोड़कर शुरू कर सकते हैं AndroidManifest.xml

<activity android:name="YourActivity"
          android:windowSoftInputMode="stateHidden" />

यह कीबोर्ड को प्रदर्शित नहीं करेगा, लेकिन फिर EditTextभी फ़ोकस हो जाता है। कि हल करने के लिए, आप सेट कर सकते हैं android:focusableInTouchmodeऔर android:focusableकरने के लिए trueअपने रूट दृश्य पर।

<LinearLayout android:orientation="vertical"
              android:focusable="true"
              android:focusableInTouchMode="true"
              ...
              >
    <EditText
         ...
       />
    <TextView
         ...
       />
    <Button
         ...
       />
</LinearLayout>

उपरोक्त कोड यह सुनिश्चित करेगा कि RelativeLayoutइसके बजाय फोकस हो रहा हैEditText


0

फोकस यूआई घटकों को चुनने के लिए है जब आप स्पर्श के अलावा कुछ का उपयोग कर रहे हैं (यानी, एक डी-पैड, एक कीबोर्ड, आदि)। कोई भी दृश्य फोकस प्राप्त कर सकता है, हालांकि कुछ डिफ़ॉल्ट रूप से ध्यान देने योग्य नहीं हैं। (आप setFocusable(true)इसके साथ ध्यान केंद्रित करने के लिए एक दृश्य बना सकते हैं और इसे ध्यान केंद्रित करने के लिए मजबूर कर सकते हैं requestFocus()।)

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

अगर आप नहीं चाहते कि सॉफ्ट कीबोर्ड अपने आप पॉप अप हो जाए तो आप इसे अस्थायी रूप से दबा सकते हैं जैसा कि @abeljus ने नोट किया है:

InputMethodManager inputManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

जब कोई उपयोगकर्ता EditTextकीबोर्ड पर क्लिक करता है , तो उसे अभी भी कीबोर्ड दिखाना चाहिए, हालांकि।

आगे की पढाई:


क्या यह उत्तर गलत है? कोई टिप्पणी नीचे की ओर नहीं छोड़ी गई थी।
सुरगाछ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.