EditText पर फोकस सेट करें


178

मेरे पास एक EditText- फ़ील्ड है और इसके लिए एक OnFocusChangeListener सेट करें। जब यह फोकस खो जाता है, तो एक विधि कहा जाता है, जो डेटाबेस में एक के साथ EditText के मूल्य की जांच करता है। यदि विधि का रिटर्न-वैल्यू सही है, तो एक टोस्ट दिखाया गया है और फोकस को फिर से एडिटटेक्स्ट पर वापस जाना चाहिए। ध्यान हमेशा एडिटटेक्स्ट पर वापस जाना चाहिए और कीबोर्ड को दिखाना चाहिए, जब तक कि विधि का रिटर्न-वैल्यू झूठा न हो।

संपादित करें: मुझे लगता है, मैंने अपनी वास्तविक समस्या को अभी तक पूरी तरह से स्पष्ट नहीं किया है: स्क्रीन पर कोई अन्य आइटम संपादित करने में सक्षम नहीं होना चाहिए, जब तक कि EditText का मूल्य एक मूल्य के लिए संपादित नहीं किया जाता है, जो विधि को "चेकलिगनाम (लिगनाम) बनाता है" " विवरण झूठा है। केवल EditText-Field संपादन योग्य होना चाहिए।

यहाँ मेरा कोड है (जो मेरे लिए काम नहीं करता है):

final EditText Liganame = (EditText) findViewById(R.id.liganame);

    Liganame.setOnFocusChangeListener(new OnFocusChangeListener() {

        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus) {

                String liganame = Liganame.getText().toString();


                if (checkLiganame(liganame)) {
                    Toast toast = Toast.makeText(CreateTableActivity.this,
                            "Dieser Liganame ist bereits vergeben",
                            Toast.LENGTH_SHORT);
                    toast.show();
                    Liganame.requestFocus();
                }
            }

और विधि:

public boolean checkLiganame(String liganame) {
    boolean found = false;

    DatabaseHelper databaseHelper = new DatabaseHelper(this);
    SQLiteDatabase db = databaseHelper.getReadableDatabase();

    Cursor cursor = db.query("liga", new String[] { "liganame" },
            "liganame = '" + liganame + "'", null, null, null, null);
    Log.i("Liganame: ", String.valueOf(cursor));

    db.close();
    if (cursor != null) {
        found = true;
    }

    return found;
}

यह कोड निम्न परिणाम की ओर ले जाता है: EditText के फ़ोकस हो जाने के बाद, फोकस EditText पर वापस आ जाता है, लेकिन मैं अब पाठ को संपादित नहीं कर सकता।

EDIT2: मेरा कोड बदला गया। परिदृश्य:

मैं पहले EditText पर क्लिक करता हूं और उसमें एक स्ट्रिंग डालता हूं, जो पहले से ही डेटाबेस में है। टोस्ट दिख रहा है। अब मैं अपने स्ट्रिंग को संपादित नहीं कर सकता। मैं कीबोर्ड पर "अगला" क्लिक करता हूं और फोकस पहले EditText पर रहता है। मैं अपने स्ट्रिंग को संपादित करने की कोशिश करता हूं, लेकिन कुछ भी नहीं होता है। इसके बजाय मेरा नया स्ट्रिंग दूसरे EditText में दिख रहा है। मैं अपने डिवाइस के बैक-एरो पर क्लिक करता हूं और पहले और दूसरे एडिट टेक्स्ट पर फिर से क्लिक करता हूं -> कोई कीबोर्ड नहीं दिखा रहा है।

यहाँ मेरा नया कोड है:

public class CreateTableActivity extends Activity implements
    OnFocusChangeListener {

private EditText Liganame, Mannschaftsanzahl;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.create_league);

    Liganame = (EditText) findViewById(R.id.liganame);
    Liganame.setOnFocusChangeListener(this);
    Mannschaftsanzahl = (EditText) findViewById(R.id.mannschaftsanzahl);
    Mannschaftsanzahl.setOnFocusChangeListener(this);

    final Button save_button = (Button) findViewById(R.id.create_tabelle_speichern_button);

    OnClickListener mCorkyListener = new OnClickListener() {
        public void onClick(View v) {
            ButtonClick();
        }
    };
    save_button.setOnClickListener(mCorkyListener);



}

@Override
public void onFocusChange(View v, boolean hasFocus) {
    String liganame = Liganame.getText().toString();

    if (checkLiganame(liganame)) {
        if (Liganame.requestFocus()) {
            getWindow()
                    .setSoftInputMode(
                            WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
            Mannschaftsanzahl.clearFocus();
            Toast.makeText(CreateTableActivity.this,
                    "Dieser Liganame ist bereits vergeben",
                    Toast.LENGTH_SHORT).show();
        }
    }
}

यदि नीचे दिए गए उत्तरों से आपको मदद
मिलती है

जवाबों:


278

बस इस लाइन को अपने ऊपर रखो onCreate()

editText.requestFocus();

यह मेरे लिए काम करता है, आशा है कि यह मदद करता है


163

कीबोर्ड दिखाने के लिए फोकस का अनुरोध करना पर्याप्त नहीं है।

फ़ोकस प्राप्त करने और कीबोर्ड दिखाने के लिए आप कुछ इस तरह से लिखेंगे:

if(myEditText.requestFocus()) {
    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}

संपादित करें: चेकलिगनाम विधि को जोड़ने के बाद उत्तर में अतिरिक्त जानकारी जोड़ना।

चेकलिगनमे विधि में आप चेक करें कि कर्सर अशक्त है या नहीं। कर्सर हमेशा एक वस्तु लौटाएगा, इसलिए नल के लिए चेक कुछ भी नहीं करता है। हालांकि समस्या लाइन में हैdb.close();

जब आप डेटाबेस कनेक्शन को बंद करते हैं, तो Cursorअमान्य हो जाता है और संभवतः सबसे अधिक शून्य हो जाता है।

मान प्राप्त करने के बाद डेटाबेस को बंद करें।

अशक्त के लिए कर्सर की जांच करने के बजाय, आपको जांचना चाहिए कि क्या लौटाए गए पंक्तियों की संख्या 0 से अधिक है: यदि (कर्सर.गेटकाउंट ()> 0) और फिर ऐसा करने के लिए अपने बूलियन को सही पर सेट करें।

EDIT2: तो यहाँ कुछ कोड के लिए यह कैसे काम करने के लिए है। EDIT3: क्षमा करें गलत कोड मैंने जोड़ा है ...; एस

सबसे पहले, आपको ध्यान केंद्रित करने की आवश्यकता है यदि दूसरा EditTextध्यान केंद्रित करता है। इसके साथ किया जा सकता है myEditText.clearFocus()। तब आपके onFocusChangeListener में आपको वास्तव में ध्यान नहीं देना चाहिए कि पहले EditTextध्यान केंद्रित है या नहीं, इसलिए onFocusChangeListener कुछ इस तरह दिख सकता है:

public class MainActivity extends Activity implements OnFocusChangeListener {
    private EditText editText1, editText2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editText1 = (EditText) findViewById(R.id.editText1);
        editText1.setOnFocusChangeListener(this);
        editText2 = (EditText) findViewById(R.id.editText2);
        editText2.setOnFocusChangeListener(this);
    }

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        String liganame = editText1.getText().toString();

        if(liganame.length() == 0) {
            if(editText1.requestFocus()) {
                getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
                editText2.clearFocus();
                Toast.makeText(MainActivity.this, "Dieser Liganame ist bereits vergeben", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

पहले चेक if(liganame.length() == 0)को अपने स्वयं के चेक से बदलें , फिर यह काम करना चाहिए। ध्यान दें, कि सभी EditText विचारों को onFocusChangeListenerउसी श्रोता को सेट करना चाहिए जैसे मैंने उदाहरण में किया है।


अब तक के लिए धन्यवाद। लेकिन इससे मेरी पूरी समस्या हल नहीं होती। मैंने अपनी समस्या का वर्णन संपादित किया।
erdalprinz

तो चेकलिगन क्या वास्तव में कर रहा है? आप (liganame.isEmpty ()) और अगर यह सच है, तो फिर से पूछें कि आप फिर से जाँच क्यों नहीं कर सकते?
दारविंड

1
धन्यवाद :-) अब मेरी विधि सही ढंग से काम कर रही है :-) लेकिन एडिटटेक्स्ट-फील्ड के साथ मेरी मुख्य समस्या अभी तक हल नहीं हुई है। मैं अभी भी इसे संपादित नहीं कर सकता, क्योंकि विधि ने एक पंक्ति
ढूंढ ली है

तो आपने जोड़ा कि (myEditText.requestFocus ()) {getWindow ()। SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); } OnFocusChanged श्रोता के अंदर?
डारविंड

हाँ, मैंने किया। Liganame.requestFocus () के तहत; मैं कीबोर्ड पर "अगला" क्लिक करता हूं, अगले EditText-Field में कूदने के लिए। टोस्ट दिखा रहा है और ध्यान BOTH EditText-Fields पर है। लेकिन मैं केवल दूसरे को संपादित कर सकता हूं। पहला, जो इस मामले में केवल एक ही फोकस होना चाहिए, अब संपादन योग्य नहीं है।
erdalprinz

59

डारविंड कोड कीबोर्ड नहीं दिखा।

यह मेरे लिए काम करता है:

        _searchText.requestFocus();
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(_searchText, InputMethodManager.SHOW_IMPLICIT);

यदि कीबोर्ड दिखाई नहीं दे रहा है, तो बल देने का प्रयास करें:

        imm.showSoftInput(_searchText, InputMethodManager.SHOW_FORCED);

19

बटन को क्लिक करने पर यह EditText का फोकस बदल देता है:

public class MainActivity extends Activity {
    private EditText e1,e2;
    private Button b1,b2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        e1=(EditText) findViewById(R.id.editText1);
        e2=(EditText) findViewById(R.id.editText2);
        e1.requestFocus();
        b1=(Button) findViewById(R.id.one);
        b2=(Button) findViewById(R.id.two);
        b1.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                e1.requestFocus();

            }
        });
        b2.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                e2.requestFocus();
            }
        });
    }
}

16

यह मुझसे काम करता है:

public void showKeyboard(final EditText ettext){
    ettext.requestFocus();
    ettext.postDelayed(new Runnable(){
            @Override public void run(){
                InputMethodManager keyboard=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                keyboard.showSoftInput(ettext,0);
            }
        }
        ,200);
}

छुपाना:

private void hideSoftKeyboard(EditText ettext){
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(ettext.getWindowToken(), 0);
}

1
आपको 200 एमएस प्रतीक्षा करने की आवश्यकता क्यों है? क्या यह आवश्यक है या मैं इसे तुरंत दिखा सकता हूं?
कोडरज़ी 123

11

यह वही है जो मेरे लिए काम करता है, फ़ोकस सेट करता है और कीबोर्ड भी दिखाता है

EditText userNameText = (EditText) findViewById(R.id.textViewUserNameText);
userNameText.setFocusable(true);
userNameText.setFocusableInTouchMode(true);
userNameText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(userNameText, InputMethodManager.SHOW_IMPLICIT);

1
धन्यवाद। setFocusableएपीआई 26 की आवश्यकता है। इसके अलावा setFocusableInTouchModeमेरे मामले में जरूरत नहीं थी।
कूलमाइंड

8

अगर हम गतिशील रूप से एक EditText बनाते हैं तो हमें निचे दिए गए RequestFocus () को सेट करना होगा।

    EditText editText = new EditText(this);
    editText.setWidth(600);
    editText.requestFocus();

यदि पहले से ही हमने xml दृश्य में घटक घोषित कर दिया है तो हमें इसे ढूंढना होगा और हम नीचे दिए गए अनुसार फोकस कर सकते हैं।

EditText e1=(EditText) findViewById(R.id.editText1);
e1.requestFocus();

यह केवल इसी EditText घटक पर ध्यान केंद्रित करता है।


6
    mEditText.setFocusableInTouchMode(true);
    mEditText.requestFocus();

    if(mEditText.requestFocus()) {
        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    }

4
    Button btnClear = (Button) findViewById(R.id.btnClear);

    EditText editText1=(EditText) findViewById(R.id.editText2);
    EditText editText2=(EditText) findViewById(R.id.editText3);

    btnClear.setOnClickListener(new View.OnClickListener() {

        @Override

        public void onClick(View v) {

            editText1.setText("");
            editText2.setText("");

            editText1.requestFocus();
        }
    });

3
 private void requestFocus(View view) {
        if (view.requestFocus()) {
            getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        }
    }

//Function Call
requestFocus(yourEditetxt);

2

आप एक ही लाइन के साथ ऐसा कर सकते हैं:

yourEditText.RequestFocusFromTouch();

वास्तव में यह एकमात्र उत्तर है जिसने मेरे लिए काम किया। यह स्पर्श को उसी तरह अनुकरण करता है जैसे मैं चाहता था।
एंटोनियो व्लासिक

2

Xamarin.Android के लिए मैंने यह एक्सटेंशन बनाया है।

public static class ViewExtensions
{
    public static void FocusEditText(this EditText editText, Activity activity)
    {
        if (editText.RequestFocus())
        {
            InputMethodManager imm = (InputMethodManager)activity.GetSystemService(Context.InputMethodService);
            imm.ShowSoftInput(editText, ShowFlags.Implicit);
        }
    }
}


2

यदि आप requestFocus()लेआउट को फुलाए जाने से पहले कॉल करने का प्रयास करते हैं , तो यह गलत हो जाएगा। यह कोड लेआउट के बढ़ने के बाद चलता है। जैसा कि ऊपर बताया गया है, आपको 200 एमएस विलंब की आवश्यकता नहीं है

editText.post(Runnable {
   if(editText.requestFocus()) {
       val imm = editText.context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager?
       imm?.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0)
   }
})

1

मुझे पता नहीं है कि क्या आप एक समाधान मिल गया है, लेकिन फिर से ध्यान केंद्रित करने का अनुरोध करने के बाद आपकी संपादन समस्या के लिए:

क्या आपने अपने edittext1 पर विधि को कॉल करने की कोशिश की है ( selectAll()या setSelection(0)अगर यह एमटीपीआई है)?

कृपया मुझे बताएं कि क्या यह मदद करता है, तो मैं एक पूर्ण समाधान के लिए अपने उत्तर को संपादित करूंगा।


1
new OnEditorActionListener(){
   @Override
   public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
      editText.requestFocus();
      //used ******* return true ******
      return **true**;
   }
} 

0

का उपयोग कर requestFocus()में onCreate()कीबोर्ड के मुद्दे नल पर प्रदर्शित नहीं प्रस्तुत किया, का उपयोग BindingAdapterएक का उपयोग कर SingleLiveEvent और उस के अंदर फोकस अनुरोध करते हैं।

यह कैसे करना है:

BindingAdapter

@BindingAdapter("requestFocus")
fun bindRequestFocus(editText: EditText, event: Event<Boolean>?) {
    event?.getContentIfNotHandled()?.let {
        if (it) editText.requestFocus()
    }
}

0

मेरा जवाब यहाँ

जैसा कि मैंने आधिकारिक दस्तावेज पर पढ़ा है, मुझे लगता है कि यह सबसे अच्छा जवाब है, बस व्यू को अपने एडिटटेक्स्ट जैसे पैरामीटर में पास करें, लेकिन शोकेसकोइबोर्ड ऐसा लगता है जैसे परिदृश्य पर काम नहीं कर रहा है

private fun showSoftKeyboard(view: View) {
    if (view.requestFocus()) {
        val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
    }
}

private fun closeSoftKeyboard(view: View) {
    if (view.requestFocus()) {
        val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.hideSoftInputFromWindow(view.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.