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

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

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

এই নির্দেশিকাটি একটি অস্থায়ী ব্যবস্থা, যতক্ষণ না আপনি আপনার অ্যাপটিকে উন্নত করে সকল ডিভাইস কনফিগারেশনের জন্য পূর্ণাঙ্গ সমর্থন প্রদান করতে পারছেন।

ফলাফল

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

সংস্করণ সামঞ্জস্যতা

এই বাস্তবায়নটি সকল এপিআই স্তরের সাথে সামঞ্জস্যপূর্ণ।

নির্ভরশীলতা

কোটলিন

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

গ্রুভি

implementation "androidx.window:window:1.5.1"
implementation "androidx.window:window-core:1.5.1"

অ্যাপের অভিমুখ পরিচালনা করুন

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

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

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

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

unspecified এবং fullUser মধ্যে পার্থক্যটি সূক্ষ্ম হলেও গুরুত্বপূর্ণ। আপনি যদি screenOrientation কোনো মান ঘোষণা না করেন, তাহলে সিস্টেমই ওরিয়েন্টেশন বেছে নেয়, এবং ওরিয়েন্টেশন নির্ধারণের জন্য সিস্টেম যে নীতি ব্যবহার করে তা ডিভাইসভেদে ভিন্ন হতে পারে।

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

এছাড়াও, আপনি সেন্সর ডেটা বিবেচনা না করে ওরিয়েন্টেশন নির্ধারণ করতে nosensor ব্যবহার করতে পারেন, কিন্তু নিম্নলিখিত কোডটি একইভাবে কাজ করবে। screenOrientation দেখুন।

২. স্ক্রিনের আকার নির্ধারণ করুন

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

মডিউলটির 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() মেথডটি ব্যবহার করুন। কখন ওরিয়েন্টেশন সীমাবদ্ধ করতে হবে, তা নির্ধারণ করার জন্য এই উইন্ডো মেট্রিকগুলোকে উইন্ডো সাইজ ক্লাসের সাথে তুলনা করা যেতে পারে।

উইন্ডোজ সাইজ ক্লাসগুলো ছোট এবং বড় স্ক্রিনের মধ্যে বিভাজন রেখা নির্ধারণ করে দেয়।

স্ক্রিনের আকার নির্ধারণ করতে WindowSizeClass#minWidthDp এবং WindowSizeClass#minHeightDp ব্রেকপয়েন্টগুলো ব্যবহার করুন:

/** 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 =
        BREAKPOINTS_V1.computeWindowSizeClass(width / density, height / density)
    return windowSizeClass.minWidthDp == 0
}
    দ্রষ্টব্য:
  • উদাহরণগুলো একটি অ্যাক্টিভিটির মেথড হিসেবে প্রয়োগ করা হয়েছে; এবং তাই, computeMaximumWindowMetrics() এর আর্গুমেন্টে অ্যাক্টিভিটিটিকে this হিসেবে ডি-রেফারেন্স করা হয়।
  • computeMaximumWindowMetrics() computeCurrentWindowMetrics() মেথডটি ব্যবহার করা হয়, কারণ অ্যাপটি মাল্টি-উইন্ডো মোডে চালু করা যেতে পারে, যা স্ক্রিন ওরিয়েন্টেশন সেটিং উপেক্ষা করে। অ্যাপ উইন্ডোর আকার নির্ধারণ করা এবং ওরিয়েন্টেশন সেটিং ওভাররাইড করার কোনো মানে হয় না, যদি না অ্যাপ উইন্ডোটি ডিভাইসের পুরো স্ক্রিন জুড়ে থাকে।

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

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

যখন আপনি নিশ্চিত হবেন যে ডিভাইসটির স্ক্রিনের আকার ছোট, তখন আপনি ম্যানিফেস্টের 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
        }
    })
}

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

আপনি যদি Jetpack Compose ব্যবহার করেন, তাহলে একই ফলাফল পাওয়ার জন্য আপনার অ্যাপের রুট Composable-এ একই compactScreen() ফাংশনটি ব্যবহার করতে পারেন।

মূল বিষয়গুলো

  • screenOrientation : অ্যাপ ম্যানিফেস্ট সেটিং যা আপনাকে নির্দিষ্ট করতে সক্ষম করে যে ডিভাইসের ওরিয়েন্টেশন পরিবর্তনের ক্ষেত্রে আপনার অ্যাপ কীভাবে সাড়া দেবে।
  • জেটপ্যাক উইন্ডোম্যানেজার : লাইব্রেরির একটি সেট যা আপনাকে অ্যাপ উইন্ডোর আকার এবং অ্যাসপেক্ট রেশিও নির্ধারণ করতে সক্ষম করে; এপিআই লেভেল ১৪ পর্যন্ত ব্যাকওয়ার্ড কম্প্যাটিবল।
  • Activity#setRequestedOrientation() : যে মেথডের সাহায্যে রানটাইমে অ্যাপের ওরিয়েন্টেশন পরিবর্তন করা যায়

যে সংগ্রহগুলিতে এই নির্দেশিকাটি রয়েছে

এই নির্দেশিকাটি বিশেষভাবে নির্বাচিত কুইক গাইড সংকলনগুলোর একটি অংশ, যা অ্যান্ড্রয়েড ডেভেলপমেন্টের বৃহত্তর লক্ষ্যগুলো পূরণ করে:

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

কোনো প্রশ্ন বা মতামত থাকলে

আমাদের প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী পেজে গিয়ে সংক্ষিপ্ত নির্দেশিকাগুলো সম্পর্কে জানুন অথবা আমাদের সাথে যোগাযোগ করে আপনার মতামত জানান।