यह तय करना कि इनपुट का तरीका किसको दिखे

जब इनपुट फ़ोकस, बदलाव किए जा सकने वाले टेक्स्ट फ़ील्ड के अंदर या बाहर जाता है, तो Android यह इनपुट को छिपा देता है —जैसे कि ऑन-स्क्रीन कीबोर्ड—जैसे कि उचित. सिस्टम यह भी तय करता है कि आपका यूज़र इंटरफ़ेस (यूआई) और टेक्स्ट फ़ील्ड ऊपर कैसे दिखेंगे इनपुट का तरीका चुनें. उदाहरण के लिए, जब स्क्रीन पर वर्टिकल स्पेस सीमित होने पर, हो सकता है कि टेक्स्ट फ़ील्ड इनपुट के तरीके के ऊपर दी गई पूरी जगह को भर दे.

ज़्यादातर ऐप्लिकेशन के लिए, डिफ़ॉल्ट तौर पर सेट की गई इन गतिविधियों की ही ज़रूरत होती है. कुछ मामलों में, हालांकि, ऐसा हो सकता है कि आप इनपुट के तरीके के दिखने पर ज़्यादा कंट्रोल पाना चाहें और इसका लेआउट पर क्या असर पड़ता है. इस लेसन में, कॉन्टेंट को कंट्रोल करने और उसका जवाब देने का तरीका बताया गया है इनपुट का तरीका किसको दिखे.

गतिविधि शुरू होने पर, सॉफ़्ट कीबोर्ड दिखाएं

हालांकि, Android आपके लेआउट में पहले टेक्स्ट फ़ील्ड पर फ़ोकस करता है, जब गतिविधि शुरू होती है, तो यह सॉफ़्ट कीबोर्ड नहीं दिखाती है. यह व्यवहार सही है क्योंकि इस गतिविधि में टेक्स्ट डालना शायद मुख्य टास्क न हो. हालांकि, अगर पाठ दर्ज करना वास्तव में प्राथमिक कार्य होता है, जैसे लॉगिन स्क्रीन में, फिर आपको हो सकता है कि आप सॉफ़्ट कीबोर्ड को डिफ़ॉल्ट रूप से देखना चाहें.

अपनी गतिविधि शुरू होने पर इनपुट का तरीका दिखाने के लिए, android:windowSoftInputMode एट्रिब्यूट "stateVisible" वैल्यू वाला <activity> एलिमेंट. उदाहरण के लिए:

<application ... >
    <activity
        android:windowSoftInputMode="stateVisible" ... >
        ...
    </activity>
   ...
</application>

तय करें कि आपका यूज़र इंटरफ़ेस (यूआई) किस तरह काम करेगा

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

किसी गतिविधि में अपने पसंदीदा इलाज के बारे में बताने के लिए, आपके मेनिफ़ेस्ट के <activity> एलिमेंट में android:windowSoftInputMode एट्रिब्यूट "बदलाव करें" में से किसी एक विकल्प के साथ वैल्यू.

उदाहरण के लिए, यह पक्का करने के लिए कि सिस्टम आपके लेआउट का साइज़ स्पेस—इससे आपका पूरा लेआउट ऐक्सेस किया जा सकता है, भले ही स्क्रोल करने की ज़रूरत है—"adjustResize" का इस्तेमाल करें:

<application ... >
   <activity
       android:windowSoftInputMode="adjustResize" ... >
       ...
   </activity>
   ...
</application>

अडजस्टमेंट की खास जानकारी को शुरुआती सॉफ़्ट कीबोर्ड के साथ मिलाया जा सकता है विज़िबिलिटी के बारे में पिछले सेक्शन में दी गई जानकारी:

<activity
    android:windowSoftInputMode="stateVisible|adjustResize" ... >
    ...
</activity>

"adjustResize" को तय करना तब ज़रूरी होता है, जब आपके यूज़र इंटरफ़ेस (यूआई) में ये कंट्रोल शामिल हों टेक्स्ट इनपुट करने के तुरंत बाद या करते समय, उपयोगकर्ता को ऐक्सेस करने की ज़रूरत पड़ सकती है. इसके लिए उदाहरण के लिए, अगर आप दस्तावेज़ के निचले हिस्से में एक बटन बार लगाने के लिए किसी मिलते-जुलते लेआउट का इस्तेमाल करते हैं "adjustResize" का इस्तेमाल करने पर, स्क्रीन लेआउट का साइज़ बदल देती है. इससे बटन बार दिखता है पर क्लिक करें.

मांग पर सॉफ़्ट कीबोर्ड दिखाएं

अगर आपकी गतिविधि के लाइफ़साइकल में कोई ऐसा तरीका है जिसके हिसाब से आपको यह पक्का करना होगा कि इनपुट विधि दिखाई दे रही है, तो आप इसका उपयोग कर सकते हैं InputMethodManager को दिखाने के लिए.

उदाहरण के लिए, नीचे दिए गए तरीके में View, जिसमें उपयोगकर्ता से उम्मीद की जाती है कुछ टाइप करो, कॉल करो इसे देने के लिए requestFocus() फ़ोकस करें, फिर इनपुट का तरीका खोलने के लिए showSoftInput() को कॉल करें:

Kotlin

fun showSoftKeyboard(view: View) {
   if (view.requestFocus()) {
       val imm = getSystemService(InputMethodManager::class.java)
       imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
   }
}

Java

public void showSoftKeyboard(View view) {
   if (view.requestFocus()) {
       InputMethodManager imm = getSystemService(InputMethodManager.class);
       imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
   }
}

सॉफ़्ट कीबोर्ड को सही तरीके से दिखाएं

कुछ परिस्थितियों में, जैसे कि कोई गतिविधि शुरू होने पर, सॉफ़्ट कीबोर्ड दिखाने के लिए, InputMethodManager.showSoftInput() का इस्तेमाल किया जा रहा है हो सकता है कि सॉफ़्टवेयर कीबोर्ड उपयोगकर्ता को न दिखे.

showSoftInput() का इस्तेमाल करते समय सॉफ़्ट कीबोर्ड किसको दिखे, यह निर्भर करता है के लिए किया गया है:

  • व्यू को पहले से ही सॉफ़्टवेयर कीबोर्ड से कनेक्ट करना ज़रूरी है. (इसके बदले में, विंडो पर फ़ोकस करने और एडिटर की ज़रूरत होती है से व्यू फ़ोकस के लिए अनुरोध करें View.requestFocus()).

  • विज़िबिलिटी पर भी android:windowSoftInputMode का असर पड़ सकता है एट्रिब्यूट और फ़्लैग का इस्तेमाल showSoftInput() करता है.

इस्तेमाल के कुछ उदाहरणों में, जैसे कि कोई गतिविधि कब शुरू हो रही है, इनमें से कुछ ज़रूरी शर्तें पूरी नहीं हुईं. सिस्टम, व्यू को इस तरह नहीं मानता सॉफ़्टवेयर कीबोर्ड से कनेक्ट करता है, तो showSoftInput() कॉल को अनदेखा करता है, साथ ही, उपयोगकर्ता को सॉफ़्ट कीबोर्ड नहीं दिख रहा हो.

सॉफ़्टवेयर कीबोर्ड सही से दिखे, इसके लिए इन विकल्पों का इस्तेमाल करें विकल्प:

  • (सुझाया गया) इस्तेमाल करें WindowInsetsControllerCompat. यह ऑब्जेक्ट Activity.onCreate() के दौरान सॉफ़्ट कीबोर्ड दिखाता है, जैसा कि का लिंक दिया गया है. तय है कि विंडो के बाद भी कॉल शेड्यूल हो जाएगा फ़ोकस है.

Kotlin

editText.requestFocus()
WindowCompat.getInsetsController(window, editText)!!.show(WindowInsetsCompat.Type.ime())

Java

editText.requestFocus();
WindowCompat.getInsetsController(getWindow(), editText).show(WindowInsetsCompat.Type.ime());
  • रनेबल गेम को पोस्ट करें. इससे यह पक्का होता है कि आपका ऐप्लिकेशन, कॉल करने से पहले View.onWindowFocusChanged() का विंडो फ़ोकस इवेंट showSoftInput().

Kotlin

class MyEditText : EditText() {
  ...
  override fun onWindowFocusChanged(hasWindowFocus: Boolean) {
    if (hasWindowFocus) {
      requestFocus()
      post {
        val imm: InputMethodManager = getSystemService(InputMethodManager::class.java)
        imm.showSoftInput(this, 0)
      }
    }
  }
}

Java

public class MyEditText extends EditText {
  ...
  @Override
  public void onWindowFocusChanged(boolean hasWindowFocus) {
    if (hasWindowFocus) {
      requestFocus();
      post(() -> {
        InputMethodManager imm = getSystemService(InputMethodManager.class);
        imm.showSoftInput(this, 0);
      });
    }
  }
}

रनटाइम के दिखने से जुड़े फ़्लैग को ध्यान से मैनेज करें

रनटाइम के दौरान, सॉफ़्ट कीबोर्ड विज़िबिलिटी को टॉगल करते समय, ध्यान रखें कि कुछ चीज़ें पास न हों इन तरीकों में वैल्यू फ़्लैग कर सकते हैं. उदाहरण के लिए, यदि ऐप्लिकेशन कॉल करते समय सॉफ़्ट कीबोर्ड दिखाई देता है इस दौरान Activity.onCreate() में View.getWindowInsetsController().show(ime()) तो ऐप्लिकेशन डेवलपर को सावधानी बरतनी चाहिए कि वे SOFT_INPUT_STATE_HIDDEN या SOFT_INPUT_STATE_ALWAYS_HIDDEN फ़्लैग सॉफ़्ट कीबोर्ड अचानक छिपा हुआ हो सकता है.

आम तौर पर, सिस्टम सॉफ़्ट कीबोर्ड को अपने-आप छिपा देता है

ज़्यादातर मामलों में, सिस्टम सॉफ़्ट कीबोर्ड को छिपा देता है. यह इनमें से कोई भी स्थिति हो सकती है:

  • उपयोगकर्ता, टेक्स्ट फ़ील्ड में दिए गए टास्क को पूरा करता है.
  • उपयोगकर्ता, बैक नेविगेशन की मदद से 'वापस जाएं' बटन दबाता है या हाथ के जेस्चर को स्वाइप करता है.
  • उपयोगकर्ता किसी दूसरे ऐप्लिकेशन पर जाता है और उस दूसरे ऐप्लिकेशन ने सेट किया है SOFT_INPUT_STATE_HIDDEN या SOFT_INPUT_STATE_ALWAYS_HIDDEN फ़्लैग जब उस व्यू पर फ़ोकस हो जाता है.

सिस्टम के पिछले काम करने के तरीके के हिसाब से, सॉफ़्ट कीबोर्ड को मैन्युअल तरीके से छिपाएं

कुछ स्थितियों में, आपके ऐप्लिकेशन को सॉफ़्ट कीबोर्ड को मैन्युअल तरीके से छिपाना होगा. इसके लिए, उदाहरण के लिए, जब टेक्स्ट फ़ील्ड का फ़ोकस बंद हो जाता है View.OnFocusChangeListener.onFocusChange. इस तकनीक का इस्तेमाल समझदारी से करें ; सॉफ़्ट कीबोर्ड को बंद करने से, उपयोगकर्ता अनुभव अचानक खराब हो जाता है.

अगर आपका ऐप्लिकेशन, सॉफ़्ट कीबोर्ड को मैन्युअल तरीके से छिपा देता है, तो आपको यह जानना होगा कि क्या सॉफ़्ट कीबोर्ड को साफ़ तौर पर या साफ़ तौर पर दिखाया गया था:

  • ऐसा माना जाता है कि सॉफ़्ट कीबोर्ड को इसके बाद साफ़ तौर पर दिखाया गया है showSoftInput() को कॉल किया गया.

  • इसके उलट, सॉफ़्ट कीबोर्ड को इंप्लिसिट रूप से इसमें दिखाया गया है इनमें से कोई एक शर्त पूरी करें:

    • लागू करते समय सिस्टम ने सॉफ़्ट कीबोर्ड दिखाया android:windowSoftInputMode.
    • आपका ऐप्लिकेशन SHOW_IMPLICIT को इसके पास कर दिया गया है showSoftInput().

आम तौर पर, hideSoftInputFromWindow() सॉफ़्ट कीबोर्ड को छिपा देता है, भले ही इसका अनुरोध कैसे किया गया, लेकिन HIDE_IMPLICIT_ONLY के साथ इसमें सिर्फ़ प्रोसेस किए गए सॉफ़्ट कीबोर्ड को खारिज किया जा सकता है.

सॉफ़्ट कीबोर्ड पर, डायलॉग या ओवरले व्यू दिखाएं

कुछ मामलों में, एडिटर गतिविधि को कोई ऐसा बदलाव करना पड़ सकता है जिसमें बदलाव न किया जा सके सॉफ़्ट कीबोर्ड के ऊपर डायलॉग या ओवरले विंडो.

आपके ऐप्लिकेशन में कुछ विकल्प मौजूद होते हैं, जिनके बारे में नीचे दिए गए सेक्शन में बताया गया है.

खास जानकारी में, यह पक्का करें कि सॉफ़्ट कीबोर्ड के विंडो फ़्लैग सही तरीके से हैंडल किए जाएं विंडो को इस तरह लक्षित करना कि वह नीचे दी गई उम्मीदों को पूरा करे वर्टिकल (z-लेयर) ऑर्डरिंग के बारे में:

  • कोई फ़्लैग नहीं (सामान्य स्थिति): सॉफ़्ट कीबोर्ड लेयर के पीछे कोई फ़्लैग मौजूद नहीं है. इस पर टेक्स्ट दिख सकता है.
  • FLAG_NOT_FOCUSABLE : सॉफ़्ट कीबोर्ड लेयर के ऊपर, लेकिन टेक्स्ट नहीं मिल रहा है.
  • FLAG_ALT_FOCUSABLE_IM : सॉफ़्ट कीबोर्ड लेयर के ऊपर, फ़ोकस किया जा सकता है, लेकिन यह सॉफ़्ट कीबोर्ड. साथ ही, यह उसके नीचे के सभी व्यू को सॉफ़्ट कीबोर्ड. यह ऐसे ऐप्लिकेशन संवाद को दिखाने के लिए उपयोगी है जो लेख का उपयोग नहीं करता सॉफ़्ट कीबोर्ड लेयर के ऊपर इनपुट.
  • FLAG_NOT_FOCUSABLE और FLAG_ALT_FOCUSABLE_IM : सॉफ़्ट कीबोर्ड लेयर के पीछे, लेकिन टेक्स्ट नहीं मिल रहा है.
  • FLAG_NOT_FOCUSABLE और FLAG_NOT_TOUCH_MODAL : सॉफ़्ट कीबोर्ड के शीर्ष पर, और टच इवेंट को "थ्रू" होने दें विंडो को सॉफ़्ट कीबोर्ड पर ले जाएं.

कोई संवाद बनाएं

FLAG_ALT_FOCUSABLE_IM का इस्तेमाल करें डायलॉग विंडो फ़्लैग को सॉफ़्ट कीबोर्ड के ऊपर और सॉफ़्ट कीबोर्ड को फ़ोकस करने से रोकें:

Kotlin

val content = TextView(this)
content.text = "Non-editable dialog on top of soft keyboard"
content.gravity = Gravity.CENTER
val builder = AlertDialog.Builder(this)
  .setTitle("Soft keyboard layering demo")
  .setView(content)
mDialog = builder.create()
mDialog!!.window!!
  .addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM)
mDialog!!.show()

Java

TextView content = new TextView(this);
content.setText("Non-editable dialog on top of soft keyboard");
content.setGravity(Gravity.CENTER);
final AlertDialog.Builder builder = new AlertDialog.Builder(this)
    .setTitle("Soft keyboard layering demo")
    .setView(content);
mDialog = builder.create();
mDialog.getWindow().addFlags(FLAG_ALT_FOCUSABLE_IM);
mDialog.show();

ओवरले व्यू बनाना

TYPE_APPLICATION_OVERLAY की जानकारी देने वाला ओवरले व्यू बनाएं विंडो टाइप और FLAG_ALT_FOCUSABLE_IM सॉफ़्ट कीबोर्ड टारगेट की गई गतिविधि के हिसाब से विंडो फ़्लैग.

Kotlin

val params = WindowManager.LayoutParams(
  width,  /* Overlay window width */
  height,  /* Overlay window height */
  WindowManager.LayoutParams.TYPE_APPLICATION, /* Overlay window type */
  WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM /* No need to allow for text input on top of the soft keyboard */
    or WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,  /* Allow touch event send to soft keyboard behind the overlay */
  PixelFormat.TRANSLUCENT
)
params.title = "Overlay window"
mOverlayView!!.layoutParams = params
windowManager.addView(mOverlayView, params)

Java

WindowManager.LayoutParams params = new WindowManager.LayoutParams(
    width, /* Overlay window width */
    height, /* Overlay window height */
    TYPE_APPLICATION, /* Overlay window type */
    FLAG_ALT_FOCUSABLE_IM /* No need to allow for text input on top of the soft keyboard */
        | FLAG_NOT_TOUCH_MODAL, /* Allow touch event send to soft keyboard behind the overlay */
    PixelFormat.TRANSLUCENT);
params.setTitle("Overlay window");
mOverlayView.setLayoutParams(params);
getWindowManager().addView(mOverlayView, params);

सॉफ़्ट कीबोर्ड के नीचे, डायलॉग बॉक्स या व्यू दिखाएं

आपके ऐप्लिकेशन को एक ऐसा डायलॉग या विंडो बनाने की ज़रूरत पड़ सकती है जिसमें ये प्रॉपर्टी:

  • किसी एडिटर गतिविधि के ज़रिए अनुरोध किए गए सॉफ़्ट कीबोर्ड के नीचे दिखता है ताकि उस पर टेक्स्ट इनपुट का असर न हो.
  • सॉफ़्ट कीबोर्ड के इनसेट के साइज़ में होने वाले बदलावों के बारे में जानकारी रहती है डायलॉग या विंडो का लेआउट अपने हिसाब से अडजस्ट कर सकते हैं.

इस मामले में, आपके ऐप्लिकेशन पर कई विकल्प मौजूद हैं. ये सेक्शन इन विकल्पों का वर्णन करते हैं.

कोई संवाद बनाएं

FLAG_NOT_FOCUSABLE दोनों को सेट करके डायलॉग बनाएं विंडो फ़्लैग और FLAG_ALT_FOCUSABLE_IM विंडो फ़्लैग:

Kotlin

val content = TextView(this)
content.text = "Non-editable dialog behind soft keyboard"
content.gravity = Gravity.CENTER
val builder = AlertDialog.Builder(this)
  .setTitle("Soft keyboard layering demo")
  .setView(content)
mDialog = builder.create()
mDialog!!.window!!
  .addFlags(FLAG_NOT_FOCUSABLE or FLAG_ALT_FOCUSABLE_IM)
mDialog!!.show()

Java

TextView content = new TextView(this);
content.setText("Non-editable dialog behind soft keyboard");
content.setGravity(Gravity.CENTER);
final AlertDialog.Builder builder = new AlertDialog.Builder(this)
    .setTitle("Soft keyboard layering demo")
    .setView(content);

mDialog = builder.create();
mDialog.getWindow()
    .addFlags(FLAG_NOT_FOCUSABLE | FLAG_ALT_FOCUSABLE_IM);
mDialog.show();

ओवरले व्यू बनाना

FLAG_NOT_FOCUSABLE, दोनों को सेट करके ओवरले व्यू बनाएं विंडो फ़्लैग और FLAG_ALT_FOCUSABLE_IM विंडो फ़्लैग:

Kotlin

val params = WindowManager.LayoutParams(
  width,  /* Overlay window width */
  height,  /* Overlay window height */
  WindowManager.LayoutParams.TYPE_APPLICATION,  /* Overlay window type */
  WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
      or WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
  PixelFormat.TRANSLUCENT
)
params.title = "Overlay window"
mOverlayView!!.layoutParams = params
windowManager.addView(mOverlayView, params)

Java

WindowManager.LayoutParams params = new WindowManager.LayoutParams(
    width, /* Overlay window width */
    height, /* Overlay window height */
    TYPE_APPLICATION, /* Overlay window type */
    FLAG_NOT_FOCUSABLE | FLAG_ALT_FOCUSABLE_IM,
    PixelFormat.TRANSLUCENT);
params.setTitle("Overlay window");
mOverlayView.setLayoutParams(params);
getWindowManager().addView(mOverlayView, params);