আমি কীভাবে অ্যান্ড্রয়েডে ওরিয়েন্টেশন পরিবর্তন অক্ষম করব?


287

আমার একটি অ্যাপ্লিকেশন রয়েছে যা আমি কেবল প্রতিকৃতি মোডে ব্যবহার করতে চাই, তাই আমি ম্যানিফেস্টে এক্সএমএলে অ্যান্ড্রয়েড: স্ক্রিন ওরিয়েন্টেশন = "প্রতিকৃতি" সংজ্ঞায়িত করেছি। এটি এইচটিসি ম্যাজিক ফোনটির জন্য ঠিক আছে (এবং অন্যান্য ফোনে ওরিয়েন্টেশন পরিবর্তনগুলিও প্রতিরোধ করে)।

তবে আমি হার্ডওয়ার কিউওয়ার্টি কীবোর্ড (ভার্চুয়াল কীবোর্ড নয়) খোলার সাথে সাথে আমার এইচটিসি জি 1 ফোনটি নিয়ে সমস্যা আছে । আমার ক্রিয়াকলাপ প্রতিকৃতি মোডে থাকে তবে মনে হয় এটি পুনরায় আরম্ভ হবে এবং এর সমস্ত রাজ্য হারাবে। এটি এইচটিসি হিরো সংস্করণে ঘটে না ।

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


2
এখানেও দেখার চেষ্টা করুন: স্ট্যাকওভারফ্লো.com
অ্যান্ডি ওয়েইনস্টেইন

উত্তর:


317

এপ্রিল 2013 আপডেট করুন: এটি করবেন না। ২০০৯ সালে যখন আমি প্রথম প্রশ্নের উত্তর দিয়েছিলাম তখন এটি কোনও ভাল ধারণা ছিল না এবং এটি এখন আসলে ভাল ধারণা নয়। এই উত্তরটি হ্যাকবডের কারণে দেখুন:

অ্যান্ড্রয়েডের ওরিয়েন্টেশন পরিবর্তনে অ্যাসিঙ্কটাস্কের সাথে পুনরায় লোডিং ক্রিয়াকলাপটি এড়িয়ে চলুন

যোগ android:configChanges="keyboardHidden|orientation"আপনার AndroidManifest.xml করতে। আপনি নিজেরাই পরিচালনা করতে যা যা কনফিগারেশন পরিবর্তন হয় তা এটি সিস্টেমকে জানিয়ে দেয় - এই ক্ষেত্রে কিছুই না করে।

<activity android:name="MainActivity"
     android:screenOrientation="portrait"
     android:configChanges="keyboardHidden|orientation">

আরও বিশদের জন্য বিকাশকারী রেফারেন্স কনফিগারেশন দেখুন।

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

আপডেট: অ্যান্ড্রয়েড ৩.২ হিসাবে আপনার "স্ক্রিনসাইজ" যুক্ত করতে হবে:

<activity
    android:name="MainActivity"
    android:screenOrientation="portrait"
    android:configChanges="keyboardHidden|orientation|screenSize">

বিকাশকারী থেকে কনফিগারেশন হ্যান্ডলিংয়ের গাইড থেকে নিজেকে পরিবর্তন করুন

সতর্কতা: অ্যান্ড্রয়েড ৩.২ (এপিআই লেভেল ১৩) দিয়ে শুরু করে, ডিভাইস প্রতিকৃতি এবং ল্যান্ডস্কেপ অভিমুখের মধ্যে স্যুইচ করলে "স্ক্রিনের আকার" পরিবর্তন হয়। সুতরাং, আপনি যদি API স্তরের 13 বা ততোধিক (minSdkVersion এবং টার্গেটএসডিকি ভার্সন বৈশিষ্ট্য দ্বারা ঘোষিত হিসাবে) বিকাশকালে ওরিয়েন্টেশন পরিবর্তনের কারণে রানটাইম পুনরায় আর্টসগুলি প্রতিরোধ করতে চান, আপনাকে অবশ্যই "ওরিয়েন্টেশন" মানের সাথে "স্ক্রীনসাইজ" মানটি অন্তর্ভুক্ত করতে হবে। অর্থাৎ, আপনাকে অবশ্যই ঘোষণা করতে হবে android:configChanges="orientation|screenSize"। তবে, যদি আপনার অ্যাপ্লিকেশনটি এপিআই লেভেল 12 বা তার চেয়ে কমের লক্ষ্যবস্তু করে, তবে আপনার ক্রিয়াকলাপ সর্বদা এই কনফিগারেশন পরিবর্তনটিকে নিজেরাই পরিচালনা করে (কোনও অ্যান্ড্রয়েড 3.2 বা উচ্চতর ডিভাইসে চলাকালীন এই কনফিগারেশন পরিবর্তনটি আপনার ক্রিয়াকলাপটি পুনরায় আরম্ভ করে না)।


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

3.2 আপডেটটি খুব কার্যকর ছিল এবং এটিই আমাকে অবরুদ্ধ করেছিল। আমার অন-কনফিগারেশন চ্যাঞ্জড হ্যান্ডলার কেন গুলি চালাচ্ছে না তা আমার ধারণা ছিল না এবং এটিই ছিল। ধন্যবাদ!
মিষ্টিলিল্মে

তৃতীয় প্যারাম - স্ক্রিন সাইজটি ২.৩.x পাওয়া যাবে না, আমি কি স্ক্রিনলয়আউটটিতে পরিবর্তন করব?
ডেডফিশ

2
@ লুম্মা নং, "স্ক্রিন সাইজ" কেবলমাত্র অ্যান্ড্রয়েড ৩.২ এবং আরও নতুনর জন্য প্রয়োজন। আপনি কোন স্তরের এপিআই লক্ষ্য করে নিচ্ছেন? আমি মনে করি আপনি কেবল 13 বা ততোধিক স্তরের লক্ষ্যবস্তু হলে এটি যুক্ত করা দরকার। আমি পরিষ্কার করার উত্তর আপডেট করব।
সূচনা 14

1
এটি যদি অন্য লোকেদের পক্ষে সহায়ক হয় তবে আমি আপনাকে উভয়কে <... অ্যান্ড্রয়েড: কনফিগারেশন = "ওরিয়েন্টেশন" ...> ওভাররাইড পরিবর্তন এবং <... অ্যান্ড্রয়েড: স্ক্রিন ওরিয়েন্টেশন = "প্রতিকৃতি" ...> থেকে ডিফল্ট সংজ্ঞায়িত করুন।
সোগগার

97

আপনি Andro আইডি পরিবর্তন করতে যেমন প্রয়োজন Intrications (আগের অ্যাস্টন) উল্লেখ এবং নিশ্চিত কার্যকলাপ হ্যান্ডলগুলি onConfigurationChanged ঘটনা যদি আপনি চান যেমন ঘাঁটা ভুলবেন না। এটি দেখতে যেমন হবে:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

দিমিত্রি Zaitsev দ্বারা হিসাবে উল্লিখিত, এটা করা উত্তম setRequestedOrientation()মধ্যে onCreate()
টিমম্মে

3
না onConfigurationChanged()আগে ফোন দিয়েছিলাম পেতে onCreate()যদি onCreate মধ্যে contentViews সংযোজনা করার আগে অভিযোজন সেটিং তাই ভাল পদ্ধতির, কনফিগারেশন এটি জন্যে যেখানে সেটিং হয় ক্লিনার তাই এই উত্তর এখনো ভাল দাঁড়িয়েছে।
স্যামুয়েল

39

আমি সর্বদা খুঁজে পেয়েছি যে আপনার উভয়ের প্রয়োজন

android:screenOrientation="nosensor" android:configChanges="keyboardHidden|orientation"

22

যেমনটি বলা হয়েছে, android:configChangesআপনার ক্রিয়াকলাপটিকে (ম্যানিফেস্ট ফাইলটিতে) সেট করুনkeyboardHidden|orientation এবং তারপরে:

1) ওভাররাইড onConfigurationChanged()

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    //here you can handle orientation change
}

2) আপনার ক্রিয়াকলাপে এই লাইনটি যুক্ত করুন onCreate()

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

এটি একই লাইন যুক্ত করার চেয়ে ভাল onConfigurationChangedএটিতে , কারণ আপনার অ্যাপ্লিকেশনটি প্রতিকৃতি মোডে ফিরে যাবে এবং তারপরে ল্যান্ডস্কেপটিতে ফিরে আসবে (এটি কেবল একবারে ঘটবে তবে এটি বিরক্তিকর)।

এছাড়াও আপনি android:screenOrientation="nosensor"আপনার ক্রিয়াকলাপের জন্য সেট করতে পারেন (ম্যানিফেস্টে)। তবে এই উপায় ব্যবহার করে আপনি মোটেও ওরিয়েন্টেশন পরিবর্তনগুলি পরিচালনা করতে সক্ষম নন।


আমি ঘোরানোর পরে ক্রিয়াকলাপটি পুনরায় সৃষ্টি এড়াতে চাইলে আমার কী করা উচিত, তবুও আমি ওএসের সেটিংসের মাধ্যমে ব্যবহারকারীকে ওরিয়েন্টেশনটি লক করার অনুমতি দিতে চাই?
অ্যান্ড্রয়েড বিকাশকারী

@androiddeveloper করে একটি পৃথক প্রশ্ন যা ইতিমধ্যে একটি উত্তর আছে: stackoverflow.com/a/14771495/926907
দিমিত্রি Zaytsev

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

@ অ্যান্ড্রয়েড ডেভেলপার আহ, আমার মনে হয় আমি বুঝতে পেরেছি। তারপরে এই লিঙ্কটি একবার দেখুন: developer.android.com/references/android/… ডক্সের মতে, ডিফল্ট ওরিয়েন্টেশন ইতিমধ্যে ব্যবহারকারীর পছন্দ বিবেচনায় নেওয়া উচিত। যদি এটি না হয় তবে আমি সন্দেহ করি এটি একটি ওএস নির্দিষ্ট আচরণ specific আপনার ফলাফলগুলি শুনে আমি আনন্দিত হব - এখন আমি এতে
আগ্রহীও

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


13

আপনার ক্রিয়াকলাপের অনক্রিয়েট পদ্ধতিতে এই কোডটি ব্যবহার করুন:

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

এখন আপনার ওরিয়েন্টেশন প্রতিকৃতিতে সেট করা হবে এবং কখনই পরিবর্তন হবে না।


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

এছাড়াও, আপনি ল্যান্ডস্কেপ অভিযোজনে পূর্ববর্তী ক্রিয়াকলাপ থেকে ক্রিয়াকলাপটি প্রবেশ করালে এটি কাজ করে না।
w3bshark

10

AndroidManifest.xML ফাইলে, প্রতিটি ক্রিয়াকলাপের জন্য আপনি শেষ screenOrientationলাইনটি যুক্ত করতে চান :

android:label="@string/app_name"
android:name=".Login"
android:screenOrientation="portrait" >

বা অ্যান্ড্রয়েড: স্ক্রিন ওরিয়েন্টেশন = "ল্যান্ডস্কেপ"


8

আপনার androidmanifest.xML ফাইলে:

   <activity android:name="MainActivity" android:configChanges="keyboardHidden|orientation">

অথবা

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

6

কোড দ্বারা স্ক্রিনটি লক করতে আপনাকে পর্দার আসল ঘূর্ণন ব্যবহার করতে হবে (0, 90, 180, 270) এবং আপনাকে এর প্রাকৃতিক অবস্থানটি জানতে হবে, একটি স্মার্টফোনে প্রাকৃতিক অবস্থান প্রতিকৃতি এবং একটি ট্যাবলেটে থাকবে, এটা ল্যান্ডস্কেপ হবে।

এখানে কোড (লক এবং আনলক পদ্ধতি) রয়েছে, এটি কয়েকটি ডিভাইসে (স্মার্টফোন এবং ট্যাবলেট) পরীক্ষা করা হয়েছে এবং এটি দুর্দান্ত কাজ করে।

public static void lockScreenOrientation(Activity activity)
{   
    WindowManager windowManager =  (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE);   
    Configuration configuration = activity.getResources().getConfiguration();   
    int rotation = windowManager.getDefaultDisplay().getRotation(); 

    // Search for the natural position of the device    
    if(configuration.orientation == Configuration.ORIENTATION_LANDSCAPE &&  
       (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180) ||  
       configuration.orientation == Configuration.ORIENTATION_PORTRAIT &&   
       (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270))   
    {   
        // Natural position is Landscape    
        switch (rotation)   
        {   
            case Surface.ROTATION_0:    
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);    
                break;      
            case Surface.ROTATION_90:   
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT); 
            break;      
            case Surface.ROTATION_180: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE); 
                break;          
            case Surface.ROTATION_270: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
                break;
        }
    }
    else
    {
        // Natural position is Portrait
        switch (rotation) 
        {
            case Surface.ROTATION_0: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
            break;   
            case Surface.ROTATION_90: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
            break;   
            case Surface.ROTATION_180: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT); 
                break;          
            case Surface.ROTATION_270: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE); 
                break;
        }
    }
}

public static void unlockScreenOrientation(Activity activity)
{
    activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}

ক্রিয়াকলাপ হিসাবে কোন পরামিতিটি পাস করা উচিত?
শুক্রবার

ক্রিয়াকলাপ যা পদ্ধতিটিকে তার ওরিয়েন্টেশনটিকে লক / আনলক করতে কল করে। এটি একটি সরকারী স্ট্যাটিক ইউটিলিটি পদ্ধতি যা বিভিন্ন ক্রিয়াকলাপ থেকে কল করা যায়।
PoOk

1
অ্যান্ড্রয়েড, দুর্দান্তভাবে কাজ করে, তবে সিরিয়াসলি, আমাদের কেবলমাত্র লক স্ক্রিনের জন্যই কেন এটি করতে হবে? !!!
কোকরিকো

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

এসডিকে 18+ তে একটি SCREEN_ORIENTATION_LOCKED পতাকা রয়েছে যা কাজ করছে বলে মনে হচ্ছে তবে আপনি প্রতিটি ডিভাইস সমর্থন করার জন্য উপরের কোডটি ব্যবহার করতে চাইবেন
ডোমিনিক এম

2

ভিজ্যুয়াল স্টুডিও জ্যামারিনে:

  1. যোগ করুন

using Android.Content.PM; আপনার ক্রিয়াকলাপের নামস্থান তালিকা।

  1. যোগ করুন

[Activity(ScreenOrientation = Android.Content.PM.ScreenOrientation.Portrait)]

আপনার শ্রেণীর জন্য একটি গুণ হিসাবে, এর মতো:

[Activity(ScreenOrientation = ScreenOrientation.Portrait)]
public class MainActivity : Activity
{...}

এই প্রশ্নটি জ্যামারিন নয়, অ্যান্ড্রয়েড সম্পর্কে জিজ্ঞাসা করছে ndঅ্যান্ড্রয়েড
ট্রেভর হার্ট


0

দয়া করে নোট করুন, কোনও পদ্ধতিই এখন কাজ করছে বলে মনে হয় না!

ইন অ্যান্ড্রয়েড স্টুডিও 1 এক সহজ উপায় যোগ হয় android:screenOrientation="nosensor"

এটি কার্যকরভাবে স্ক্রিন ওরিয়েন্টেশনকে লক করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.