বড় পর্দার রান্নার বই

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

তারকা রেটিং

রেসিপিগুলি বড় স্ক্রিনের অ্যাপের গুণমানের নির্দেশিকাগুলির সাথে কতটা সারিবদ্ধ তার উপর ভিত্তি করে তারকা রেট করা হয়।

পাঁচ তারকা রেটিং টিয়ার 1 এর মানদণ্ড পূরণ করে, বড় স্ক্রীনের পার্থক্য
চার তারকা রেটিং টিয়ার 2 এর মানদণ্ড পূরণ করে, বড় স্ক্রীন অপ্টিমাইজ করা হয়েছে
তিন তারকা রেটিং টিয়ার 3 এর মানদণ্ড পূরণ করে, বড় স্ক্রীন প্রস্তুত
দুই তারকা রেটিং কিছু বড় স্ক্রীনের ক্ষমতা প্রদান করে, কিন্তু বড় স্ক্রীনের অ্যাপের গুণমানের নির্দেশিকা থেকে কম পড়ে
এক তারকা রেটিং একটি নির্দিষ্ট ব্যবহারের ক্ষেত্রে প্রয়োজনীয়তা পূরণ করে, কিন্তু সঠিকভাবে বড় পর্দা সমর্থন করে না

Chromebook ক্যামেরা সমর্থন

তিন তারকা রেটিং

Chromebook ব্যবহারকারীদের দ্বারা Google Play-এ নজরে পড়ুন।

যদি আপনার ক্যামেরা অ্যাপ শুধুমাত্র প্রাথমিক ক্যামেরা বৈশিষ্ট্যগুলির সাথে কাজ করতে পারে, তাহলে অ্যাপ স্টোরগুলিকে Chromebook ব্যবহারকারীদের অ্যাপ ইনস্টল করতে বাধা দেবেন না কারণ আপনি অসাবধানতাবশত হাই-এন্ড ফোনে পাওয়া উন্নত ক্যামেরা বৈশিষ্ট্যগুলি নির্দিষ্ট করেছেন৷

Chromebook-এ একটি বিল্ট-ইন ফ্রন্ট (ব্যবহারকারী-মুখী) ক্যামেরা রয়েছে যা ভিডিও কনফারেন্সিং, স্ন্যাপশট এবং অন্যান্য অ্যাপ্লিকেশনের জন্য ভাল কাজ করে। কিন্তু সমস্ত ক্রোমবুকের পিছনে (বিশ্বমুখী) ক্যামেরা থাকে না এবং Chromebook-এর বেশিরভাগ ব্যবহারকারী-মুখী ক্যামেরা অটোফোকাস বা ফ্ল্যাশ সমর্থন করে না।

সর্বোত্তম অনুশীলন

বহুমুখী ক্যামেরা অ্যাপ্লিকেশানগুলি ক্যামেরা কনফিগারেশন নির্বিশেষে সমস্ত ডিভাইসকে সমর্থন করে — সামনের ক্যামেরা, পিছনের ক্যামেরা, USB দ্বারা সংযুক্ত বাহ্যিক ক্যামেরা সহ ডিভাইস।

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

উপকরণ

  • CAMERA অনুমতি: আপনার অ্যাপকে একটি ডিভাইসের ক্যামেরায় অ্যাক্সেস দেয়
  • <uses-feature> ম্যানিফেস্ট উপাদান: আপনার অ্যাপের দ্বারা ব্যবহৃত বৈশিষ্ট্যগুলি অ্যাপ স্টোরকে জানায়
  • required বৈশিষ্ট্য: অ্যাপ স্টোরগুলিকে নির্দেশ করে যে আপনার অ্যাপ নির্দিষ্ট বৈশিষ্ট্য ছাড়াই কাজ করতে পারে কিনা

ধাপ

সারাংশ

CAMERA অনুমতি ঘোষণা করুন. ক্যামেরা বৈশিষ্ট্যগুলি ঘোষণা করুন যা মৌলিক ক্যামেরা সমর্থন প্রদান করে। প্রতিটি বৈশিষ্ট্য প্রয়োজন কিনা তা নির্দিষ্ট করুন।

1. CAMERA অনুমতি ঘোষণা করুন৷

অ্যাপ ম্যানিফেস্টে নিম্নলিখিত অনুমতি যোগ করুন:

<uses-permission android:name="android.permission.CAMERA" />
2. মৌলিক ক্যামেরা বৈশিষ্ট্য ঘোষণা করুন

অ্যাপ ম্যানিফেস্টে নিম্নলিখিত বৈশিষ্ট্যগুলি যুক্ত করুন:

<uses-feature android:name="android.hardware.camera.any" android:required="false" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />
<uses-feature android:name="android.hardware.camera.flash" android:required="false" />
3. প্রতিটি বৈশিষ্ট্য প্রয়োজন কিনা তা নির্দিষ্ট করুন

android.hardware.camera.any বৈশিষ্ট্যের জন্য android:required="false" সেট করুন যে কোনো ধরনের বিল্ট-ইন বা এক্সটার্নাল ক্যামেরা আছে—অথবা কোনো ক্যামেরা নেই এমন ডিভাইসের মাধ্যমে আপনার অ্যাপে অ্যাক্সেস সক্ষম করতে।

অন্যান্য বৈশিষ্ট্যগুলির জন্য, android:required="false" সেট করুন যাতে Chromebook-এর মতো ডিভাইস যাতে ব্যাক ক্যামেরা, অটোফোকাস বা ফ্ল্যাশ নেই অ্যাপ স্টোরগুলিতে আপনার অ্যাপ অ্যাক্সেস করতে পারে।

ফলাফল

Chromebook ব্যবহারকারীরা Google Play এবং অন্যান্য অ্যাপ স্টোর থেকে আপনার অ্যাপ ডাউনলোড এবং ইনস্টল করতে পারেন। এবং ফোনের মতো পূর্ণ বৈশিষ্ট্যযুক্ত ক্যামেরা সমর্থন সহ ডিভাইসগুলি তাদের ক্যামেরা কার্যকারিতাতে সীমাবদ্ধ থাকবে না।

আপনার অ্যাপের দ্বারা সমর্থিত ক্যামেরা বৈশিষ্ট্যগুলি স্পষ্টভাবে সেট করে এবং আপনার অ্যাপের প্রয়োজনীয় বৈশিষ্ট্যগুলি নির্দিষ্ট করে, আপনি আপনার অ্যাপটিকে যতটা সম্ভব ডিভাইসে উপলব্ধ করেছেন৷

অতিরিক্ত সম্পদ

আরও তথ্যের জন্য, <uses-feature> ডকুমেন্টেশনে ক্যামেরা হার্ডওয়্যার বৈশিষ্ট্যগুলি দেখুন।

অ্যাপ ওরিয়েন্টেশন ফোনে সীমাবদ্ধ কিন্তু বড় স্ক্রিনের ডিভাইসে নয়

দুই তারকা রেটিং

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

আপনি কীভাবে এটি উভয় উপায়ে পেতে পারেন—অ্যাপটিকে ছোট স্ক্রিনে প্রতিকৃতির অভিযোজনে সীমাবদ্ধ করুন, কিন্তু বড় পর্দায় ল্যান্ডস্কেপ সক্ষম করুন?

সর্বোত্তম অনুশীলন

সেরা অ্যাপগুলি ব্যবহারকারীর পছন্দগুলিকে সম্মান করে যেমন ডিভাইসের অভিযোজন।

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

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

উপকরণ

  • screenOrientation : অ্যাপ ম্যানিফেস্ট সেটিংস যা আপনাকে নির্দিষ্ট করতে সক্ষম করে যে আপনার অ্যাপ ডিভাইসের অভিযোজন পরিবর্তনে কীভাবে সাড়া দেয়
  • Jetpack WindowManager : লাইব্রেরির সেট যা আপনাকে অ্যাপ উইন্ডোর আকার এবং আকৃতির অনুপাত নির্ধারণ করতে সক্ষম করে; API স্তর 14 এর সাথে পশ্চাদমুখী সামঞ্জস্যপূর্ণ
  • Activity#setRequestedOrientation() : পদ্ধতি যা দিয়ে আপনি রানটাইমে অ্যাপের অভিযোজন পরিবর্তন করতে পারেন

ধাপ

সারাংশ

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

1. অ্যাপ ম্যানিফেস্টে ওরিয়েন্টেশন সেটিং নির্দিষ্ট করুন

আপনি হয় অ্যাপ ম্যানিফেস্টের screenOrientation উপাদান ঘোষণা করা এড়াতে পারেন (যে ক্ষেত্রে ওরিয়েন্টেশন unspecified থেকে ডিফল্ট হয়) অথবা স্ক্রিন ওরিয়েন্টেশনকে fullUser এ সেট করতে পারেন। ব্যবহারকারী যদি সেন্সর-ভিত্তিক ঘূর্ণন লক না করে থাকে, তাহলে আপনার অ্যাপটি সমস্ত ডিভাইসের অভিযোজন সমর্থন করবে।

<activity
    android:name=".MyActivity"
    android:screenOrientation="fullUser">

unspecified এবং fullUser ব্যবহারের মধ্যে পার্থক্যটি সূক্ষ্ম কিন্তু গুরুত্বপূর্ণ। আপনি যদি একটি screenOrientation মান ঘোষণা না করেন, তাহলে সিস্টেমটি ওরিয়েন্টেশন বেছে নেয়, এবং সিস্টেম যে নীতিটি ব্যবহার করে ওরিয়েন্টেশন নির্ধারণ করতে তা ডিভাইস থেকে ডিভাইসে আলাদা হতে পারে। অন্যদিকে, fullUser নির্দিষ্ট করা ডিভাইসটির জন্য ব্যবহারকারীর সংজ্ঞায়িত আচরণের সাথে আরও ঘনিষ্ঠভাবে মেলে: ব্যবহারকারী যদি সেন্সর-ভিত্তিক ঘূর্ণন লক করে থাকে, অ্যাপটি ব্যবহারকারীর পছন্দ অনুসরণ করে; অন্যথায়, সিস্টেমটি চারটি সম্ভাব্য স্ক্রীন অভিযোজনের যেকোনো একটিকে অনুমতি দেয় (পোর্ট্রেট, ল্যান্ডস্কেপ, বিপরীত প্রতিকৃতি, বা বিপরীত ল্যান্ডস্কেপ)। android:screenOrientation দেখুন।

2. পর্দার আকার নির্ধারণ করুন

সমস্ত ব্যবহারকারী-অনুমোদিত অভিযোজন সমর্থন করার জন্য ম্যানিফেস্ট সেটের সাথে, আপনি স্ক্রীনের আকারের উপর ভিত্তি করে প্রোগ্রামগতভাবে অ্যাপ্লিকেশন অভিযোজন নির্দিষ্ট করতে পারেন৷

মডিউলের build.gradle বা build.gradle.kts ফাইলে Jetpack WindowManager লাইব্রেরি যোগ করুন:

কোটলিন

implementation("androidx.window:window:version")
implementation("androidx.window:window-core:version")

গ্রোভি

implementation 'androidx.window:window:version'
implementation 'androidx.window:window-core:version'

একটি WindowMetrics অবজেক্ট হিসাবে ডিভাইসের পর্দার আকার পেতে Jetpack WindowManager WindowMetricsCalculator#computeMaximumWindowMetrics() পদ্ধতি ব্যবহার করুন। কখন অভিযোজন সীমাবদ্ধ করতে হবে তা নির্ধারণ করতে উইন্ডোর মেট্রিকগুলিকে উইন্ডো আকারের ক্লাসের সাথে তুলনা করা যেতে পারে।

উইন্ডোজ আকারের ক্লাস ছোট এবং বড় পর্দার মধ্যে ব্রেকপয়েন্ট প্রদান করে।

পর্দার আকার নির্ধারণ করতে WindowWidthSizeClass#COMPACT এবং WindowHeightSizeClass#COMPACT ব্রেকপয়েন্ট ব্যবহার করুন:

কোটলিন

/** Determines whether the device has a compact screen. **/
fun compactScreen() : Boolean {
    val metrics = WindowMetricsCalculator.getOrCreate().computeMaximumWindowMetrics(this)
    val width = metrics.bounds.width()
    val height = metrics.bounds.height()
    val density = resources.displayMetrics.density
    val windowSizeClass = WindowSizeClass.compute(width/density, height/density)

    return windowSizeClass.windowWidthSizeClass == WindowWidthSizeClass.COMPACT ||
        windowSizeClass.windowHeightSizeClass == WindowHeightSizeClass.COMPACT
}

জাভা

/** Determines whether the device has a compact screen. **/
private boolean compactScreen() {
    WindowMetrics metrics = WindowMetricsCalculator.getOrCreate().computeMaximumWindowMetrics(this);
    int width = metrics.getBounds().width();
    int height = metrics.getBounds().height();
    float density = getResources().getDisplayMetrics().density;
    WindowSizeClass windowSizeClass = WindowSizeClass.compute(width/density, height/density);
    return windowSizeClass.getWindowWidthSizeClass() == WindowWidthSizeClass.COMPACT ||
                windowSizeClass.getWindowHeightSizeClass() == WindowHeightSizeClass.COMPACT;
}
    দ্রষ্টব্য:
  • উপরের উদাহরণগুলি একটি কার্যকলাপের পদ্ধতি হিসাবে প্রয়োগ করা হয়; এবং তাই, computeMaximumWindowMetrics() এর আর্গুমেন্টে কার্যকলাপটিকে this হিসাবে ডিরেফারেন্স করা হয়েছে।
  • computeMaximumWindowMetrics() পদ্ধতিটি computeCurrentWindowMetrics() এর পরিবর্তে ব্যবহার করা হয় কারণ অ্যাপটি মাল্টি-উইন্ডো মোডে লঞ্চ করা যেতে পারে, যা স্ক্রিন ওরিয়েন্টেশন সেটিং উপেক্ষা করে। অ্যাপ উইন্ডোর সাইজ নির্ধারণ করার এবং অরিয়েন্টেশন সেটিং ওভাররাইড করার কোন মানে নেই যদি না অ্যাপ উইন্ডোটি পুরো ডিভাইসের স্ক্রীন হয়।

আপনার অ্যাপে computeMaximumWindowMetrics() পদ্ধতি উপলব্ধ করার জন্য নির্ভরতা ঘোষণা করার নির্দেশাবলীর জন্য WindowManager দেখুন।

3. অ্যাপ ম্যানিফেস্ট সেটিং ওভাররাইড করুন

আপনি যখন নির্ধারণ করেছেন যে ডিভাইসটির কম্প্যাক্ট স্ক্রীন সাইজ আছে, তখন আপনি ম্যানিফেস্টের screenOrientation সেটিং ওভাররাইড করতে Activity#setRequestedOrientation() কল করতে পারেন:

কোটলিন

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    requestedOrientation = if (compactScreen())
        ActivityInfo.SCREEN_ORIENTATION_PORTRAIT else
        ActivityInfo.SCREEN_ORIENTATION_FULL_USER
    ...
    // Replace with a known container that you can safely add a
    // view to where the view won't affect the layout and the view
    // won't be replaced.
    val container: ViewGroup = binding.container

    // Add a utility view to the container to hook into
    // View.onConfigurationChanged. This is required for all
    // activities, even those that don't handle configuration
    // changes. You can't use Activity.onConfigurationChanged,
    // since there are situations where that won't be called when
    // the configuration changes. View.onConfigurationChanged is
    // called in those scenarios.
    container.addView(object : View(this) {
        override fun onConfigurationChanged(newConfig: Configuration?) {
            super.onConfigurationChanged(newConfig)
            requestedOrientation = if (compactScreen())
                ActivityInfo.SCREEN_ORIENTATION_PORTRAIT else
                ActivityInfo.SCREEN_ORIENTATION_FULL_USER
        }
    })
}

জাভা

@Override
protected void onCreate(Bundle savedInstance) {
    super.onCreate(savedInstanceState);
    if (compactScreen()) {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    } else {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_USER);
    }
    ...
    // Replace with a known container that you can safely add a
    // view to where the view won't affect the layout and the view
    // won't be replaced.
    ViewGroup container = binding.container;

    // Add a utility view to the container to hook into
    // View.onConfigurationChanged. This is required for all
    // activities, even those that don't handle configuration
    // changes. You can't use Activity.onConfigurationChanged,
    // since there are situations where that won't be called when
    // the configuration changes. View.onConfigurationChanged is
    // called in those scenarios.
    container.addView(new View(this) {
        @Override
        protected void onConfigurationChanged(Configuration newConfig) {
            super.onConfigurationChanged(newConfig);
            if (compactScreen()) {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            } else {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_USER);
            }
        }
    });
}

onCreate() এবং View.onConfigurationChanged() পদ্ধতিতে যুক্তি যোগ করার মাধ্যমে, আপনি সর্বাধিক উইন্ডো মেট্রিক্স পেতে সক্ষম হন এবং যখনই কার্যকলাপের আকার পরিবর্তন করা হয় বা প্রদর্শনের মধ্যে স্থানান্তরিত হয়, যেমন একটি ডিভাইস ঘূর্ণনের পরে বা যখন একটি ভাঁজযোগ্য ডিভাইস ভাঁজ করা বা খোলা হয়। কনফিগারেশন পরিবর্তন কখন ঘটে এবং কখন তারা কার্যকলাপ বিনোদনের কারণ হয় সে সম্পর্কে আরও তথ্যের জন্য, কনফিগারেশন পরিবর্তন পরিচালনা করুন দেখুন

ফলাফল

ডিভাইসের ঘূর্ণন নির্বিশেষে আপনার অ্যাপটি এখন ছোট স্ক্রিনে পোর্ট্রেট ওরিয়েন্টেশনে থাকা উচিত। বড় স্ক্রিনে, অ্যাপটিকে ল্যান্ডস্কেপ এবং পোর্ট্রেট ওরিয়েন্টেশন সমর্থন করা উচিত।

অতিরিক্ত সম্পদ

সব সময় সমস্ত ডিভাইস কনফিগারেশন সমর্থন করার জন্য আপনার অ্যাপ আপগ্রেড করার জন্য, নিম্নলিখিতগুলি দেখুন:

বাহ্যিক কীবোর্ড স্পেসবারের সাথে মিডিয়া প্লেব্যাক বিরতি এবং পুনরায় শুরু করুন

চার তারকা রেটিং

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

যখন মিডিয়া হল উইন্ডোর একমাত্র উপাদান (যেমন পূর্ণ-স্ক্রীন ভিডিও প্লেব্যাক), তখন অ্যাক্টিভিটি লেভেলে বা জেটপ্যাক কম্পোজে, স্ক্রীন লেভেলে কীপ্রেস ইভেন্টগুলিতে প্রতিক্রিয়া জানান।

সর্বোত্তম অনুশীলন

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

উপকরণ

  • KEYCODE_SPACE : স্পেসবারের জন্য কী কোড ধ্রুবক।

রচনা করুন

  • onPreviewKeyEvent : Modifier যা একটি কম্পোনেন্টকে হার্ডওয়্যার কী ইভেন্টগুলিকে আটকাতে সক্ষম করে যখন এটি (বা এর বাচ্চাদের মধ্যে একটি) ফোকাস করা হয়।
  • onKeyEvent : onPreviewKeyEvent এর মতই, এই Modifier একটি কম্পোনেন্টকে হার্ডওয়্যার কী ইভেন্টগুলিকে আটকাতে সক্ষম করে যখন এটি (বা তার সন্তানদের মধ্যে একটি) ফোকাস করা হয়।

ভিউ

  • onKeyUp() : যখন একটি কী প্রকাশ করা হয় এবং একটি কার্যকলাপের মধ্যে একটি দৃশ্য দ্বারা পরিচালনা করা হয় না তখন বলা হয়।

ধাপ

সারাংশ

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

1. কীবোর্ড ইভেন্টের জন্য শুনুন

ভিউ

আপনার অ্যাপের একটি কার্যকলাপে, onKeyUp() পদ্ধতিটি ওভাররাইড করুন:

কোটলিন

override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean {
    ...
}

জাভা

@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    ...
}

এই পদ্ধতিটি প্রতিবার একটি চাপা কী রিলিজ করার সময় ব্যবহার করা হয়, তাই এটি প্রতিটি কীস্ট্রোকের জন্য ঠিক একবার ফায়ার হয়।

রচনা করুন

জেটপ্যাক কম্পোজের সাহায্যে, আপনি কীস্ট্রোক পরিচালনা করে এমন পর্দার মধ্যে onPreviewKeyEvent বা onKeyEvent সংশোধকটি ব্যবহার করতে পারেন:

Column(modifier = Modifier.onPreviewKeyEvent { event ->
    if (event.type == KeyEventType.KeyUp) {
        ...
    }
    ...
})

বা

Column(modifier = Modifier.onKeyEvent { event ->
    if (event.type == KeyEventType.KeyUp) {
        ...
    }
    ...
})

2. ফিল্টার স্পেসবার প্রেস

onKeyUp() পদ্ধতির ভিতরে বা কম্পোজ onPreviewKeyEvent এবং onKeyEvent সংশোধক পদ্ধতির মধ্যে, আপনার মিডিয়া উপাদানে সঠিক ইভেন্ট পাঠাতে KeyEvent.KEYCODE_SPACE এর জন্য ফিল্টার করুন:

ভিউ

কোটলিন

if (keyCode == KeyEvent.KEYCODE_SPACE) {
    togglePlayback()
    return true
}
return false

জাভা

if (keyCode == KeyEvent.KEYCODE_SPACE) {
    togglePlayback();
    return true;
}
return false;

রচনা করুন

Column(modifier = Modifier.onPreviewKeyEvent { event ->
    if (event.type == KeyEventType.KeyUp && event.key == Key.Spacebar) {
        ...
    }
    ...
})

বা

Column(modifier = Modifier.onKeyEvent { event ->
    if (event.type == KeyEventType.KeyUp && event.key == Key.Spacebar) {
        ...
    }
    ...
})

ফলাফল

আপনার অ্যাপ এখন স্পেসবার কী প্রেসে সাড়া দিতে পারে একটি ভিডিও বা অন্য মিডিয়াকে বিরতি এবং পুনরায় শুরু করতে।

অতিরিক্ত সম্পদ

কীবোর্ড ইভেন্টগুলি এবং কীভাবে সেগুলি পরিচালনা করবেন সে সম্পর্কে আরও জানতে, কীবোর্ড ইনপুট হ্যান্ডেল দেখুন।

লেখনী পাম প্রত্যাখ্যান

পাঁচ তারকা রেটিং

একটি স্টাইলাস বড় পর্দায় একটি ব্যতিক্রমী উত্পাদনশীল এবং সৃজনশীল হাতিয়ার হতে পারে। কিন্তু যখন ব্যবহারকারীরা একটি স্টাইলাস ব্যবহার করে একটি অ্যাপের সাথে আঁকেন, লেখেন বা ইন্টারঅ্যাক্ট করেন, তারা মাঝে মাঝে তাদের হাতের তালু দিয়ে স্ক্রীন স্পর্শ করে। সিস্টেমটি দুর্ঘটনাজনিত পাম স্পর্শ হিসাবে ইভেন্টটিকে স্বীকৃতি এবং খারিজ করার আগে স্পর্শ ইভেন্টটি আপনার অ্যাপে রিপোর্ট করা যেতে পারে।

সর্বোত্তম অনুশীলন

আপনার অ্যাপটিকে অবশ্যই বহিরাগত স্পর্শ ইভেন্টগুলি সনাক্ত করতে হবে এবং সেগুলি উপেক্ষা করতে হবে৷ Android একটি MotionEvent অবজেক্ট পাঠানোর মাধ্যমে একটি পাম স্পর্শ বাতিল করে৷ ACTION_CANCEL বা ACTION_POINTER_UP এবং FLAG_CANCELED এর জন্য বস্তুটি পরীক্ষা করুন তা নির্ধারণ করতে পামের স্পর্শ দ্বারা সৃষ্ট অঙ্গভঙ্গি প্রত্যাখ্যান করতে হবে কিনা।

উপকরণ

  • MotionEvent : স্পর্শ এবং আন্দোলন ইভেন্ট প্রতিনিধিত্ব করে। একটি ইভেন্ট উপেক্ষা করা উচিত কিনা তা নির্ধারণ করার জন্য প্রয়োজনীয় তথ্য রয়েছে৷
  • OnTouchListener#onTouch() : MotionEvent অবজেক্টগুলি গ্রহণ করে।
  • MotionEvent#getActionMasked() : একটি মোশন ইভেন্টের সাথে যুক্ত ক্রিয়া দেখায়।
  • ACTION_CANCEL : MotionEvent ধ্রুবক যা ইঙ্গিত করে যে একটি অঙ্গভঙ্গি পূর্বাবস্থায় ফেরানো উচিত৷
  • ACTION_POINTER_UP : MotionEvent ধ্রুবক যা নির্দেশ করে যে প্রথম পয়েন্টার ছাড়া অন্য একটি পয়েন্টার বেড়ে গেছে (অর্থাৎ, ডিভাইস স্ক্রিনের সাথে যোগাযোগ ত্যাগ করেছে)।
  • FLAG_CANCELED : MotionEvent ধ্রুবক যা নির্দেশ করে যে পয়েন্টার উপরে যাওয়ার কারণে একটি অনিচ্ছাকৃত স্পর্শ ইভেন্ট হয়েছে। Android 13 (API স্তর 33) এবং উচ্চতর ACTION_POINTER_UP এবং ACTION_CANCEL ইভেন্টগুলিতে যোগ করা হয়েছে৷

ধাপ

সারাংশ

আপনার অ্যাপে পাঠানো MotionEvent অবজেক্ট পরীক্ষা করুন। ইভেন্ট বৈশিষ্ট্য নির্ধারণ করতে MotionEvent API ব্যবহার করুন:

  • একক-পয়েন্টার ইভেন্টACTION_CANCEL চেক করুন। Android 13 এবং উচ্চতর তে, FLAG_CANCELED এর জন্যও পরীক্ষা করুন।
  • মাল্টি-পয়েন্টার ইভেন্ট — Android 13 এবং উচ্চতর, ACTION_POINTER_UP এবং FLAG_CANCELED চেক করুন।

ACTION_CANCEL এবং ACTION_POINTER_UP / FLAG_CANCELED ইভেন্টগুলিতে প্রতিক্রিয়া দিন৷

1. গতি ঘটনা বস্তু অর্জন

আপনার অ্যাপে একটি OnTouchListener যোগ করুন:

কোটলিন

val myView = findViewById<View>(R.id.myView).apply {
    setOnTouchListener { view, event ->
        // Process motion event.
    }
}

জাভা

View myView = findViewById(R.id.myView);
myView.setOnTouchListener( (view, event) -> {
    // Process motion event.
});
2. ইভেন্ট অ্যাকশন এবং পতাকা নির্ধারণ করুন

ACTION_CANCEL পরীক্ষা করুন, যা সমস্ত API স্তরে একটি একক-পয়েন্টার ইভেন্ট নির্দেশ করে৷ Android 13 এবং পরবর্তীতে, FLAG_CANCELED. এর জন্য ACTION_POINTER_UP চেক করুন৷

কোটলিন

val myView = findViewById<View>(R.id.myView).apply {
    setOnTouchListener { view, event ->
        when (event.actionMasked) {
            MotionEvent.ACTION_CANCEL -> {
                //Process canceled single-pointer motion event for all SDK versions.
            }
            MotionEvent.ACTION_POINTER_UP -> {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU &&
                   (event.flags and MotionEvent.FLAG_CANCELED) == MotionEvent.FLAG_CANCELED) {
                    //Process canceled multi-pointer motion event for Android 13 and higher.
                }
            }
        }
        true
    }
}

জাভা

View myView = findViewById(R.id.myView);
myView.setOnTouchListener( (view, event) -> {
    switch (event.getActionMasked()) {
        case MotionEvent.ACTION_CANCEL:
            // Process canceled single-pointer motion event for all SDK versions.
        case MotionEvent.ACTION_UP:
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU &&
               (event.getFlags() & MotionEvent.FLAG_CANCELED) == MotionEvent.FLAG_CANCELED) {
                //Process canceled multi-pointer motion event for Android 13 and higher.
            }
    }
    return true;
});
3. অঙ্গভঙ্গি পূর্বাবস্থায় ফেরান৷

একবার আপনি একটি পামের স্পর্শ সনাক্ত করলে, আপনি অঙ্গভঙ্গির অনস্ক্রিন প্রভাবগুলি পূর্বাবস্থায় ফিরিয়ে আনতে পারেন।

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

ফলাফল

আপনার অ্যাপ এখন অ্যান্ড্রয়েড 13 এবং উচ্চতর API লেভেলে মাল্টি-পয়েন্টার ইভেন্টের জন্য এবং সমস্ত API লেভেলে একক-পয়েন্টার ইভেন্টের জন্য পাম টাচ সনাক্ত করতে এবং প্রত্যাখ্যান করতে পারে।

অতিরিক্ত সম্পদ

আরও তথ্যের জন্য, নিম্নলিখিত দেখুন:

WebView রাজ্য ব্যবস্থাপনা

তিন তারকা রেটিং

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

সর্বোত্তম অনুশীলন

একটি WebView পুনঃনির্মিত হওয়ার সংখ্যা কমিয়ে দিন। WebView এর অবস্থা পরিচালনা করতে ভাল, এবং আপনি যতটা সম্ভব কনফিগারেশন পরিবর্তনগুলি পরিচালনা করে এই গুণমানটি লাভ করতে পারেন। আপনার অ্যাপটিকে অবশ্যই কনফিগারেশন পরিবর্তনগুলি পরিচালনা করতে হবে কারণ Activity রিক্রিয়েশন (কনফিগারেশন পরিবর্তনগুলি পরিচালনা করার সিস্টেমের উপায়) WebView পুনরায় তৈরি করে, যার ফলে WebView তার অবস্থা হারায়৷

উপকরণ

  • android:configChanges : ম্যানিফেস্ট <activity> উপাদানের বৈশিষ্ট্য। অ্যাক্টিভিটি দ্বারা পরিচালিত কনফিগারেশন পরিবর্তনগুলি তালিকাভুক্ত করে।
  • View#invalidate() : পদ্ধতি যা একটি ভিউকে পুনরায় আঁকার কারণ করে। WebView দ্বারা উত্তরাধিকারসূত্রে প্রাপ্ত।

ধাপ

সারাংশ

WebView অবস্থা সংরক্ষণ করতে, যতটা সম্ভব Activity বিনোদন এড়িয়ে চলুন, এবং তারপর WebView অবৈধ হতে দিন যাতে এটি তার অবস্থা বজায় রাখার সময় আকার পরিবর্তন করতে পারে।

1. আপনার অ্যাপের AndroidManifest.xml ফাইলে কনফিগারেশন পরিবর্তন যোগ করুন

আপনার অ্যাপ দ্বারা পরিচালিত কনফিগারেশন পরিবর্তনগুলি নির্দিষ্ট করে কার্যকলাপ বিনোদন এড়িয়ে চলুন (ব্যবস্থার পরিবর্তে):

<activity
  android:name=".MyActivity"
  android:configChanges="screenLayout|orientation|screenSize
      |keyboard|keyboardHidden|smallestScreenSize" />

2. যখনই আপনার অ্যাপ কনফিগারেশন পরিবর্তন পায় তখন WebView বাতিল করুন

কোটলিন

override fun onConfigurationChanged(newConfig: Configuration) {
    super.onConfigurationChanged(newConfig)
    webView.invalidate()
}

জাভা

@Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    webview.invalidate();
}

এই ধাপটি শুধুমাত্র ভিউ সিস্টেমের ক্ষেত্রে প্রযোজ্য, কারণ Jetpack Compose-এর সঠিকভাবে Composable এলিমেন্টের আকার পরিবর্তন করার জন্য কিছু বাতিল করার প্রয়োজন নেই। যাইহোক, সঠিকভাবে পরিচালিত না হলে কম্পোজ প্রায়ই একটি WebView পুনরায় তৈরি করে। আপনার রচনা অ্যাপ্লিকেশানগুলিতে WebView অবস্থা সংরক্ষণ এবং পুনরুদ্ধার করতে Accompanist WebView র‍্যাপার ব্যবহার করুন৷

ফলাফল

আপনার অ্যাপ্লিকেশানের WebView উপাদানগুলি এখন তাদের অবস্থা ধরে রেখেছে এবং একাধিক কনফিগারেশন পরিবর্তন জুড়ে স্ক্রোল অবস্থান, আকার পরিবর্তন থেকে শুরু করে ফোল্ডিং এবং আনফোল্ডিং পর্যন্ত।

অতিরিক্ত সম্পদ

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

RecyclerView রাজ্য ব্যবস্থাপনা

তিন তারকা রেটিং

RecyclerView ন্যূনতম গ্রাফিকাল সংস্থান ব্যবহার করে প্রচুর পরিমাণে ডেটা প্রদর্শন করতে পারে। একটি RecyclerView তার আইটেমগুলির তালিকার মাধ্যমে স্ক্রোল করার সময়, RecyclerView স্ক্রিনে স্ক্রোল করার সাথে সাথে নতুন আইটেম তৈরি করতে স্ক্রিন বন্ধ করে দেওয়া আইটেমগুলির View ইনস্ট্যান্সগুলি পুনরায় ব্যবহার করে। কিন্তু কনফিগারেশন পরিবর্তন, যেমন ডিভাইস ঘূর্ণন, একটি RecyclerView এর অবস্থা পুনরায় সেট করতে পারে, যা ব্যবহারকারীদের পুনরায় RecyclerView আইটেমগুলির তালিকায় তাদের পূর্ববর্তী অবস্থানে স্ক্রোল করতে বাধ্য করে।

সর্বোত্তম অনুশীলন

RecyclerView এর অবস্থা বজায় রাখা উচিত - বিশেষ করে, স্ক্রোল অবস্থান - এবং সমস্ত কনফিগারেশন পরিবর্তনের সময় এর তালিকা উপাদানগুলির অবস্থা।

উপকরণ

  • RecyclerView.Adapter#setStateRestorationPolicy() : একটি RecyclerView.Adapter কনফিগারেশন পরিবর্তনের পরে কীভাবে তার অবস্থা পুনরুদ্ধার করে তা নির্দিষ্ট করে।
  • ViewModel : একটি কার্যকলাপ বা খণ্ডের জন্য অবস্থা ধরে রাখে।

ধাপ

সারাংশ

RecyclerView স্ক্রোল অবস্থান সংরক্ষণ করতে RecyclerView.Adapter এর রাষ্ট্র পুনরুদ্ধার নীতি সেট করুন। RecyclerView তালিকা আইটেমগুলির অবস্থা সংরক্ষণ করুন। RecyclerView অ্যাডাপ্টারে তালিকার আইটেমগুলির অবস্থা যোগ করুন এবং তালিকা আইটেমগুলির অবস্থা পুনরুদ্ধার করুন যখন তারা একটি ViewHolder সাথে আবদ্ধ হয়।

1. Adapter রাজ্য পুনরুদ্ধার নীতি সক্ষম করুন৷

RecyclerView অ্যাডাপ্টারের রাষ্ট্র পুনরুদ্ধার নীতি সক্ষম করুন যাতে কনফিগারেশন পরিবর্তনগুলির মধ্যে RecyclerView এর স্ক্রলিং অবস্থান বজায় থাকে। অ্যাডাপ্টার কনস্ট্রাক্টরে নীতি স্পেসিফিকেশন যোগ করুন:

কোটলিন

class MyAdapter() : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
    init {
        stateRestorationPolicy = StateRestorationPolicy.PREVENT_WHEN_EMPTY
    }
    ...
}

জাভা

class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    public Adapter() {
        setStateRestorationPolicy(StateRestorationPolicy.PREVENT_WHEN_EMPTY);
    }
    ...
}

2. রাষ্ট্রীয় তালিকা আইটেমগুলির অবস্থা সংরক্ষণ করুন৷

জটিল RecyclerView তালিকার আইটেমগুলির অবস্থা সংরক্ষণ করুন, যেমন আইটেমগুলিতে EditText উপাদান রয়েছে৷ উদাহরণস্বরূপ, একটি EditText এর অবস্থা সংরক্ষণ করতে, পাঠ্য পরিবর্তনগুলি ক্যাপচার করতে একটি onClick হ্যান্ডলারের মতো একটি কলব্যাক যোগ করুন। কলব্যাকের মধ্যে, কোন ডেটা সংরক্ষণ করতে হবে তা নির্ধারণ করুন:

কোটলিন

input.addTextChangedListener(
    afterTextChanged = { text ->
        text?.let {
            // Save state here.
        }
    }
)

জাভা

input.addTextChangedListener(new TextWatcher() {

    ...

    @Override
    public void afterTextChanged(Editable s) {
        // Save state here.
    }
});

আপনার Activity বা Fragment কলব্যাক ঘোষণা করুন। রাজ্য সংরক্ষণ করতে একটি ViewModel ব্যবহার করুন.

3. Adapter তালিকা আইটেমের অবস্থা যোগ করুন

আপনার RecyclerView.Adapter এ তালিকা আইটেমগুলির অবস্থা যোগ করুন। যখন আপনার হোস্ট Activity বা Fragment তৈরি করা হয় তখন অ্যাডাপ্টার কনস্ট্রাক্টরের কাছে আইটেমের অবস্থা পাস করুন:

কোটলিন

val adapter = MyAdapter(items, viewModel.retrieveState())

জাভা

MyAdapter adapter = new MyAdapter(items, viewModel.retrieveState());

4. অ্যাডাপ্টারের ViewHolder তালিকা আইটেমের অবস্থা পুনরুদ্ধার করুন

RecyclerView.Adapter এ, যখন আপনি একটি আইটেমের সাথে একটি ViewHolder আবদ্ধ করেন, তখন আইটেমের অবস্থা পুনরুদ্ধার করুন:

কোটলিন

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
    ...
    val item = items[position]
    val state = states.firstOrNull { it.item == item }

    if (state != null) {
        holder.restore(state)
    }
}

জাভা

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
    ...
    Item item = items[position];
    Arrays.stream(states).filter(state -> state.item == item)
        .findFirst()
        .ifPresent(state -> holder.restore(state));
}

ফলাফল

আপনার RecyclerView এখন তার স্ক্রোল অবস্থান এবং RecyclerView তালিকার প্রতিটি আইটেমের অবস্থা পুনরুদ্ধার করতে সক্ষম।

অতিরিক্ত সম্পদ

বিচ্ছিন্নযোগ্য কীবোর্ড ব্যবস্থাপনা

তিন তারকা রেটিং

বিচ্ছিন্নযোগ্য কীবোর্ডগুলির জন্য সমর্থন বড় স্ক্রীন ডিভাইসগুলিতে ব্যবহারকারীর উত্পাদনশীলতা সর্বাধিক করতে সহায়তা করে। অ্যান্ড্রয়েড প্রতিবার একটি ডিভাইসে কীবোর্ড সংযুক্ত বা বিচ্ছিন্ন করার সময় একটি কনফিগারেশন পরিবর্তন ট্রিগার করে, যা UI অবস্থার ক্ষতির কারণ হতে পারে। আপনার অ্যাপ্লিকেশানটি হয় সংরক্ষণ এবং তার অবস্থা পুনরুদ্ধার করতে পারে, সিস্টেমকে কার্যকলাপ বিনোদন পরিচালনা করতে দেয়, বা কীবোর্ড কনফিগারেশন পরিবর্তনের জন্য কার্যকলাপ বিনোদনকে সীমাবদ্ধ করে ৷ সব ক্ষেত্রে কীবোর্ড সম্পর্কিত সমস্ত ডেটা Configuration অবজেক্টে সংরক্ষণ করা হয়। কনফিগারেশন অবজেক্টের keyboard এবং keyboardHidden ক্ষেত্রগুলিতে কীবোর্ডের ধরন এবং এর প্রাপ্যতা সম্পর্কে তথ্য থাকে।

সর্বোত্তম অনুশীলন

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

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

  1. সিস্টেমটিকে বর্তমানে চলমান কার্যকলাপটি পুনরায় তৈরি করতে দিন এবং আপনি আপনার অ্যাপের অবস্থা পরিচালনার যত্ন নেবেন৷
  2. কনফিগারেশন পরিবর্তন নিজেই পরিচালনা করুন (ক্রিয়াকলাপটি পুনরায় তৈরি করা হবে না):
    • সমস্ত কীবোর্ড-সম্পর্কিত কনফিগারেশন মান ঘোষণা করুন
    • একটি কনফিগারেশন পরিবর্তন হ্যান্ডলার তৈরি করুন

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

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

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

উপকরণ

  • android:configChanges : অ্যাপ ম্যানিফেস্টের <activity> উপাদানের বৈশিষ্ট্য। অ্যাপ পরিচালনা করে কনফিগারেশন পরিবর্তন সম্পর্কে সিস্টেমকে জানায়।
  • View#onConfigurationChanged() : পদ্ধতি যা একটি নতুন অ্যাপ কনফিগারেশনের প্রচারে প্রতিক্রিয়া দেখায়।

ধাপ

সারাংশ

configChanges অ্যাট্রিবিউট ঘোষণা করুন এবং কীবোর্ড-সম্পর্কিত মান যোগ করুন। অ্যাক্টিভিটির ভিউ হায়ারার্কিতে একটি View যোগ করুন এবং কনফিগারেশন পরিবর্তনের জন্য শুনুন।

1. configChanges অ্যাট্রিবিউট ঘোষণা করুন

ইতিমধ্যে পরিচালিত কনফিগারেশন পরিবর্তনের তালিকায় keyboard|keyboardHidden মানগুলি যোগ করে অ্যাপ ম্যানিফেস্টে <activity> উপাদান আপডেট করুন:

<activity
            android:configChanges="...|keyboard|keyboardHidden">

2. ভিউ হায়ারার্কিতে একটি খালি ভিউ যোগ করুন

একটি নতুন ভিউ ঘোষণা করুন এবং ভিউ এর onConfigurationChanged() পদ্ধতিতে আপনার হ্যান্ডলার কোড যোগ করুন:

কোটলিন

val v = object : View(this) {
  override fun onConfigurationChanged(newConfig: Configuration?) {
    super.onConfigurationChanged(newConfig)
    // Handler code here.
  }
}

জাভা

View v = new View(this) {
    @Override
    protected void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        // Handler code here.
    }
};

ফলাফল

আপনার অ্যাপ্লিকেশান এখন একটি বহিরাগত কীবোর্ড সংযুক্ত বা বিচ্ছিন্ন করা হচ্ছে যা বর্তমানে চলমান কার্যকলাপ পুনরায় তৈরি না করে প্রতিক্রিয়া জানাবে৷

অতিরিক্ত সম্পদ

কীবোর্ড সংযুক্তি বা বিচ্ছিন্নকরণের মতো কনফিগারেশন পরিবর্তনের সময় আপনার অ্যাপের UI অবস্থা কীভাবে সংরক্ষণ করবেন তা জানতে, UI অবস্থা সংরক্ষণ করুন দেখুন।

{% শব্দার্থে %} {% endverbatim %} {% শব্দার্থে %} {% endverbatim %}