ইনপুট পদ্ধতি দৃশ্যমানতা হ্যান্ডেল

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

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

কার্যকলাপ শুরু হলে নরম কীবোর্ড দেখান

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

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

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

আপনার UI এর প্রতিক্রিয়া কেমন হওয়া উচিত তা নির্দিষ্ট করুন

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

একটি ক্রিয়াকলাপে আপনার পছন্দের চিকিত্সা ঘোষণা করতে, আপনার ম্যানিফেস্টের <activity> উপাদানে android:windowSoftInputMode বৈশিষ্ট্যটি "সামঞ্জস্য করুন" মানগুলির একটির সাথে ব্যবহার করুন৷

উদাহরণ স্বরূপ, সিস্টেমটি আপনার লেআউটকে উপলভ্য জায়গায় রিসাইজ করে তা নিশ্চিত করতে-যা আপনার লেআউটের সমস্ত সামগ্রী অ্যাক্সেসযোগ্য রাখে, এমনকি যদি এটির জন্য স্ক্রল করার প্রয়োজন হয়- "adjustResize" ব্যবহার করুন:

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

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

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

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

চাহিদা অনুযায়ী নরম কীবোর্ড দেখান

আপনার কার্যকলাপের জীবনচক্রে যদি এমন একটি পদ্ধতি থাকে যেখানে আপনি নিশ্চিত করতে চান যে ইনপুট পদ্ধতি দৃশ্যমান, আপনি এটি দেখানোর জন্য InputMethodManager ব্যবহার করতে পারেন৷

উদাহরণস্বরূপ, নিম্নলিখিত পদ্ধতিটি একটি View নেয় যেখানে ব্যবহারকারীর কিছু টাইপ করার আশা করা হয়, এটিকে ফোকাস দেওয়ার জন্য requestFocus() কল করে, তারপর ইনপুট পদ্ধতি খুলতে showSoftInput() কল করে:

কোটলিন

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() এর সাথে ভিউ ফোকাসের অনুরোধ করার জন্য উইন্ডোটিকে ফোকাস করতে হবে এবং এডিটর ভিউর প্রয়োজন হবে।

  • এছাড়াও দৃশ্যমানতা android:windowSoftInputMode বৈশিষ্ট্য এবং showSoftInput() দ্বারা ব্যবহৃত পতাকা দ্বারা প্রভাবিত হতে পারে।

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

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

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

কোটলিন

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

জাভা

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

কোটলিন

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_HIDDEN বা SOFT_INPUT_STATE_ALWAYS_HIDDEN ফ্ল্যাগ সেট না করার বিষয়ে সতর্ক হওয়া উচিত। নরম কীবোর্ড অপ্রত্যাশিতভাবে লুকানো থাকলে প্রাথমিক লঞ্চের সময়।

সিস্টেম সাধারণত নরম কীবোর্ড স্বয়ংক্রিয়ভাবে লুকিয়ে রাখে

বেশিরভাগ পরিস্থিতিতে, সিস্টেমটি নরম কীবোর্ড লুকিয়ে রাখে। এটি নিম্নলিখিত ক্ষেত্রে যে কোনো হতে পারে:

  • ব্যবহারকারী পাঠ্য ক্ষেত্রের কাজটি শেষ করে।
  • ব্যবহারকারী পিছনের ন্যাভিগেশন সহ ব্যাক কী টিপে বা সোয়াইপ অঙ্গভঙ্গি করে।
  • ব্যবহারকারী অন্য অ্যাপে নেভিগেট করে, এবং সেই অন্য অ্যাপটি SOFT_INPUT_STATE_HIDDEN বা SOFT_INPUT_STATE_ALWAYS_HIDDEN পতাকা সেট করেছে যখন ভিউ ফোকাস লাভ করে।

পূর্ববর্তী সিস্টেম আচরণের উপর ভিত্তি করে ম্যানুয়ালি নরম কীবোর্ড লুকান

আপনার অ্যাপটিকে কিছু পরিস্থিতিতে ম্যানুয়ালি সফট কীবোর্ড লুকিয়ে রাখতে হবে—উদাহরণস্বরূপ, যখন View.OnFocusChangeListener.onFocusChange এ পাঠ্য ক্ষেত্রটি ফোকাস হারায়। এই কৌশলটি বিচক্ষণতার সাথে ব্যবহার করুন; নরম কীবোর্ড বন্ধ করা অপ্রত্যাশিতভাবে ব্যবহারকারীর অভিজ্ঞতাকে ক্ষতিগ্রস্ত করে।

যদি আপনার অ্যাপটি ম্যানুয়ালি সফ্ট কীবোর্ড লুকিয়ে রাখে, তাহলে আপনাকে জানতে হবে যে সফট কীবোর্ডটি স্পষ্টভাবে দেখানো হয়েছে নাকি অন্তর্নিহিতভাবে :

  • showSoftInput() এ কল করার পরে নরম কীবোর্ডটি স্পষ্টভাবে দেখানো হয়েছে বলে মনে করা হয়।

  • বিপরীতভাবে, নরম কীবোর্ডকে নিম্নোক্ত অবস্থার মধ্যে যেকোন একটিতে নিহিতভাবে দেখানো হয়েছে বলে মনে করা হয়:

    • android:windowSoftInputMode প্রয়োগ করার সময় সিস্টেমটি নরম কীবোর্ড দেখিয়েছে।
    • আপনার অ্যাপ showSoftInput() করতে SHOW_IMPLICIT পাস করেছে।

সাধারণত, hideSoftInputFromWindow() সফ্ট কীবোর্ডকে যেভাবে অনুরোধ করা হোক না কেন তা লুকিয়ে রাখে, কিন্তু HIDE_IMPLICIT_ONLY এর সাথে এটি শুধুমাত্র একটি অন্তর্নিহিতভাবে অনুরোধ করা নরম কীবোর্ড খারিজ করার মধ্যে সীমাবদ্ধ থাকতে পারে।

নরম কীবোর্ডের উপরে একটি ডায়ালগ বা ওভারলে ভিউ দেখান

কিছু পরিস্থিতিতে, সম্পাদক কার্যকলাপের জন্য সফট কীবোর্ডের উপরে একটি অ-সম্পাদনাযোগ্য ডায়ালগ বা ওভারলে উইন্ডো তৈরি করতে হতে পারে।

আপনার অ্যাপে কয়েকটি বিকল্প রয়েছে, যা নিম্নলিখিত বিভাগগুলি বর্ণনা করে৷

সংক্ষেপে, উইন্ডোটিকে লক্ষ্য করে সফ্ট কীবোর্ডের উইন্ডো ফ্ল্যাগগুলি সঠিকভাবে পরিচালনা করা নিশ্চিত করুন যাতে এটি উল্লম্ব (জেড-লেয়ার) অর্ডার সম্পর্কিত নিম্নলিখিত প্রত্যাশাগুলিকে সন্তুষ্ট করে:

  • কোন পতাকা নেই (সাধারণ ক্ষেত্রে): নরম কীবোর্ড স্তরের পিছনে, এবং পাঠ্য গ্রহণ করতে পারে।
  • 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 ডায়ালগ উইন্ডো পতাকা ব্যবহার করুন ডায়ালগটিকে সফ্ট কীবোর্ডের উপরে রাখতে, এবং সফট কীবোর্ডকে ফোকাস করা থেকে আটকাতে:

কোটলিন

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 উইন্ডো পতাকা নির্দিষ্ট করে একটি ওভারলে ভিউ তৈরি করুন।

কোটলিন

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 উইন্ডো পতাকা উভয় সেট করে একটি ডায়ালগ তৈরি করুন:

কোটলিন

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 উইন্ডো পতাকা উভয় সেট করে একটি ওভারলে ভিউ তৈরি করুন:

কোটলিন

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