ইনপুট পদ্ধতির দৃশ্যমানতা ম্যানেজ করুন

ইনপুট ফোকাস এডিট করা যায় এমন টেক্সট ফিল্ডের ভিতরে বা বাইরে গেলে, Android ইনপুট দেখায় বা লুকায় —যেমন স্ক্রিনের কীবোর্ড—প্রয়োজন মতো। এছাড়াও, ইনপুট পদ্ধতির উপরে আপনার UI এবং টেক্সট ফিল্ড কীভাবে দেখানো হবে তা সিস্টেম নির্ধারণ করে। যেমন, স্ক্রিনে উল্লম্ব স্পেস সীমিত হলে, টেক্সট ফিল্ড ইনপুট পদ্ধতির উপরে থাকা সব স্পেস পূরণ করতে পারে।

বেশিরভাগ অ্যাপের ক্ষেত্রে, এই ডিফল্ট অ্যাকশনই যথেষ্ট। তবে, কিছু ক্ষেত্রে, আপনি ইনপুট পদ্ধতির দৃশ্যমানতা এবং এটি লেআউটকে কীভাবে প্রভাবিত করে তার উপর আরও নিয়ন্ত্রণ চাইতে পারেন। ইনপুট পদ্ধতির দৃশ্যমানতা কীভাবে নিয়ন্ত্রণ ও তার উত্তর দিতে হয় তা এই টিউটোরিয়ালে ব্যাখ্যা করা হয়েছে।

অ্যাক্টিভিটি শুরু হলে সফ্ট কীবোর্ড দেখান

অ্যাক্টিভিটি শুরু হওয়ার সময় Android আপনার লেআউটের প্রথম টেক্সট ফিল্ডে ফোকাস করলেও, এটি সফ্ট কীবোর্ড দেখায় না। এই আচরণটি উপযুক্ত কারণ টেক্সট লেখা অ্যাক্টিভিটির প্রাথমিক কাজ নাও হতে পারে। তবে, যদি টেক্সট লেখা সত্যিই প্রাথমিক কাজ হয়, যেমন লগইন স্ক্রিনে, তাহলে আপনি সম্ভবত ডিফল্ট হিসেবে সফ্ট কীবোর্ড দেখাতে চান।

আপনার অ্যাক্টিভিটি শুরু হওয়ার সময় ইনপুট পদ্ধতি দেখাতে, android:windowSoftInputMode অ্যাট্রিবিউটটি <activity> এলিমেন্টে "stateVisible" ভ্যালু সহ যোগ করুন। যেমন:

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

আপনার UI কীভাবে উত্তর দেবে তা নির্দিষ্ট করুন

স্ক্রিনে সফ্ট কীবোর্ড দেখা গেলে, এটি আপনার অ্যাপের UI-এর জন্য উপলভ্য জায়গার পরিমাণ কমিয়ে দেয়। আপনার UI-এর দৃশ্যমান অংশ কীভাবে অ্যাডজাস্ট করতে হবে তা সিস্টেম সিদ্ধান্ত নেয়, তবে এটি সঠিক নাও হতে পারে। আপনার অ্যাপের জন্য সেরা আচরণ নিশ্চিত করতে, বাকি স্পেসে সিস্টেম কীভাবে আপনার UI দেখাবে তা নির্দিষ্ট করুন।

কোনও অ্যাক্টিভিটিতে আপনার পছন্দের ট্রিটমেন্ট ঘোষণা করতে, আপনার ম্যানিফেস্টের <activity> এলিমেন্টে android:windowSoftInputMode অ্যাট্রিবিউট ব্যবহার করুন এবং "adjust" ভ্যালুগুলির মধ্যে একটি বেছে নিন।

যেমন, সিস্টেম যাতে উপলভ্য স্পেস অনুযায়ী আপনার লেআউটের সাইজ পরিবর্তন করে—যার ফলে স্ক্রল করতে হলেও আপনার লেআউটের সব কন্টেন্ট অ্যাক্সেসযোগ্য থাকে—সেটি নিশ্চিত করতে "adjustResize" ব্যবহার করুন:

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

আপনি আগের বিভাগ থেকে প্রাথমিক সফ্ট কীবোর্ড দৃশ্যমানতা স্পেসিফিকেশনের সাথে অ্যাডজাস্টমেন্ট স্পেসিফিকেশন একত্রিত করতে পারেন:

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

"adjustResize" উল্লেখ করা গুরুত্বপূর্ণ যদি আপনার UI-তে এমন কন্ট্রোল থাকে যা ব্যবহারকারীর টেক্সট ইনপুট করার সময় বা অবিলম্বে অ্যাক্সেস করার প্রয়োজন হতে পারে। যেমন, আপনি যদি স্ক্রিনের নিচে বোতাম বার দেখানোর জন্য রিলেটিভ লেআউট ব্যবহার করেন, তাহলে "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)
   }
}

জাভা

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

সফ্ট কীবোর্ড নির্ভরযোগ্যভাবে দেখান

কিছু পরিস্থিতি, যেমন কোনও অ্যাক্টিভিটি শুরু হওয়ার সময়, সফ্ট কীবোর্ড দেখানোর জন্য InputMethodManager.showSoftInput() ব্যবহার করলে সফ্টওয়্যার কীবোর্ড ব্যবহারকারীকে নাও দেখানো হতে পারে।

showSoftInput() ব্যবহার করার সময় সফ্ট কীবোর্ডের দৃশ্যমানতা নিম্নলিখিত শর্তের উপর নির্ভর করে:

  • ভিউটি অবশ্যই সফ্টওয়্যার কীবোর্ডের সাথে আগে থেকেই কানেক্ট করা থাকতে হবে। (এর জন্য, উইন্ডো ফোকাস করা এবং এডিটর ভিউকে View.requestFocus()-এর মাধ্যমে ভিউ ফোকাসের অনুরোধ করতে হবে)।

  • এছাড়াও, showSoftInput()-এর ব্যবহার করা android:windowSoftInputMode অ্যাট্রিবিউট ও ফ্ল্যাগ দ্বারা দৃশ্যমানতা প্রভাবিত হতে পারে।

নির্দিষ্ট কিছু ব্যবহারের ক্ষেত্রে, যেমন কোনও অ্যাক্টিভিটি শুরু হওয়ার সময়, এইসব প্রয়োজনীয় শর্তের কিছু পূরণ করা হয় না। সিস্টেম ভিউটিকে সফ্টওয়্যার কীবোর্ডের সাথে কানেক্ট করা হিসেবে বিবেচনা করে না, showSoftInput() কল উপেক্ষা করে এবং ব্যবহারকারী সফ্ট কীবোর্ড দেখতে পান না।

সফ্টওয়্যার কীবোর্ড যাতে নির্ভরযোগ্যভাবে দেখানো হয় তা নিশ্চিত করতে, আপনি নিম্নলিখিত বিকল্পগুলি ব্যবহার করতে পারেন:

  • (সাজেস্ট করা হয়েছে) WindowInsetsControllerCompat ব্যবহার করুন। এই অবজেক্ট Activity.onCreate() চলাকালীন সফ্ট কীবোর্ড দেখায়, যেমনটি নিম্নলিখিত কোড স্নিপেটে দেখানো হয়েছে। উইন্ডো ফোকাস করার পরে কল শিডিউল করা হবে বলে গ্যারান্টি দেওয়া হয়।

Kotlin

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

জাভা

editText.requestFocus();
WindowCompat.getInsetsController(getWindow(), editText).show(WindowInsetsCompat.Type.ime());
  • রান করা যায় এমন কিছু পোস্ট করুন। এটি নিশ্চিত করে যে আপনার অ্যাপ showSoftInput() কল করার আগে View.onWindowFocusChanged() থেকে উইন্ডো ফোকাস ইভেন্ট না পাওয়া পর্যন্ত অপেক্ষা করে।

Kotlin

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

জাভা

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()

জাভা

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)

জাভা

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()

জাভা

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)

জাভা

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