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

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

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

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

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

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

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

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

উপকরণ

  • screenOrientation : অ্যাপ ম্যানিফেস্ট সেটিং যা আপনাকে নির্দিষ্ট করতে সক্ষম করে যে ডিভাইসের ওরিয়েন্টেশন পরিবর্তনের ক্ষেত্রে আপনার অ্যাপ কীভাবে সাড়া দেবে।
  • Activity#setRequestedOrientation() : যে মেথডের সাহায্যে রানটাইমে অ্যাপের ওরিয়েন্টেশন পরিবর্তন করা যায়
  • LocalConfiguration : একটি কম্পোজেবল লোকাল প্রোভাইডার যা বর্তমান ডিভাইসের Configuration প্রকাশ করে, যার মাধ্যমে আপনি ডিপি-তে স্ক্রিনের ডাইমেনশন পড়তে পারেন।
  • LaunchedEffect : কম্পোজ সাইড-ইফেক্ট এপিআই যা কোনো কী পরিবর্তিত হলে (এই ক্ষেত্রে, কনফিগারেশন পরিবর্তিত হলে) একটি কোড ব্লক রান করে।

পদক্ষেপ

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

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

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

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

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

২. কম্পোজে গতিশীলভাবে অভিমুখ সীমাবদ্ধ করুন

Jetpack Compose-এ, আপনি LocalConfiguration.current থেকে রিঅ্যাক্টিভভাবে ডিপি-তে বর্তমান স্ক্রিনের ডাইমেনশনগুলো পড়তে পারেন এবং কনফিগারেশন পরিবর্তনের সাথে সাথে অ্যাক্টিভিটির ওরিয়েন্টেশন আপডেট করতে একটি LaunchedEffect ব্যবহার করতে পারেন।

যদি স্ক্রিনের প্রস্থ বা উচ্চতা 600dp (যা ফোনের কম্প্যাক্ট ব্রেকপয়েন্টের সমতুল্য) থেকে কম হয়, তাহলে ওরিয়েন্টেশন পোর্ট্রেটে সীমাবদ্ধ রাখুন। অন্যথায়, ব্যবহারকারীর পছন্দ ( unspecified বা fullUser ) অনুযায়ী সিস্টেমকে অ্যাপটি ঘোরানোর অনুমতি দিন।

এখানে সম্পূর্ণ, কম্পাইলযোগ্য বাস্তবায়নটি দেওয়া হলো:

val configuration = LocalConfiguration.current
val context = LocalActivity.current

LaunchedEffect(configuration) {
    val activity = context ?: return@LaunchedEffect
    // Determine if screen is compact (phone-sized) in either width or height
    val isCompact = configuration.screenWidthDp < 600 || configuration.screenHeightDp < 600
    activity.requestedOrientation = if (isCompact) {
        ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
    } else {
        ActivityInfo.SCREEN_ORIENTATION_FULL_USER
    }
}

LaunchedEffect(configuration) ব্লকের ভিতরে লজিকটি যোগ করার মাধ্যমে, আপনি অ্যাপের কনফিগারেশন পরিবর্তনের সাথে সাথে ওরিয়েন্টেশন সেটিংটি প্রতিক্রিয়াশীলভাবে ওভাররাইড করতে পারবেন; যেমন—যখন অ্যাক্টিভিটির আকার পরিবর্তন করা হয়, ডিসপ্লে পরিবর্তন করা হয়, অথবা যখন কোনো ফোল্ডেবল ডিভাইস ভাঁজ করা বা খোলা হয়।

কনফিগারেশন পরিবর্তন কখন ঘটে এবং কখন এর ফলে অ্যাক্টিভিটি পুনরায় তৈরি হয়, সে সম্পর্কে আরও তথ্যের জন্য, “কনফিগারেশন পরিবর্তন পরিচালনা” দেখুন।

ফলাফল

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

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

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