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


110

আমি কেবল একটি ওরিয়েন্টেশন পরিবর্তন বৈশিষ্ট্যটি প্রয়োগ করেছি - উদাহরণস্বরূপ যখন বিন্যাসটি প্রতিকৃতি থেকে ল্যান্ডস্কেপে পরিবর্তিত হয় (বা বিপরীতে)। ওরিয়েন্টেশন পরিবর্তন ইভেন্টটি শেষ হয়ে গেলে আমি কীভাবে সনাক্ত করতে পারি।

OrientationEventListenerকাজ করে নি। লেআউট ওরিয়েন্টেশন পরিবর্তনের ইভেন্টগুলি সম্পর্কে আমি কীভাবে বিজ্ঞপ্তি পেতে পারি?


আমার ক্ষেত্রে, ওরিয়েন্টেশন পরিবর্তিত হলে অনক্রিয়েট () বলা হয়েছিল।
জোসিয়েল নোয়েস 12'16

উত্তর:


292

ক্রিয়াকলাপের onCfigrationChanged পদ্ধতি ব্যবহার করুন । নিম্নলিখিত কোডটি দেখুন:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
    }
}

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

<activity android:name=".MyActivity"
          android:configChanges="orientation|keyboardHidden"
          android:label="@string/app_name">

দ্রষ্টব্য: অ্যান্ড্রয়েড 3..২ (এপিআই স্তর ১৩) বা ততোধিকের সাথে, ডিভাইসটি প্রতিকৃতি এবং ল্যান্ডস্কেপ অভিযোজনের মধ্যে স্যুইচ করলে "স্ক্রিনের আকার" পরিবর্তন হয়। সুতরাং, আপনি যদি 13 স্তরের বা ততোধিক স্তরের জন্য বিকাশ করার সময় ওরিয়েন্টেশন পরিবর্তনের কারণে রানটাইম পুনরায় চালু করতে বাধা দিতে চান, তবে আপনাকে অবশ্যই এন্ড্রয়েড: কনফিগারেশনগুলি = "ওরিয়েন্টেশন | স্ক্রিন সাইজ" এপিআই লেভেল 13 বা তার বেশিের জন্য ডিক্লেয়ার করতে হবে ।

আশা করি এটা তোমাকে সাহায্য করবে... :)


3
এটি ভাল তবে এটি পোর্ট্রেট এক্সএমএল লেআউট ফাইলগুলি ব্যবহার করে লেআউট-ল্যান্ড ফোল্ডারে লেআউট এক্সএমএল লোড করে না।
প্রোগ্রামার

22
অ্যাজটেক কোডার, আপনি যখন "অ্যান্ড্রয়েড: কনফিগারেশন =" ওরিয়েন্টেশন "অন্তর্ভুক্ত করবেন তখন আপনি ঘোষণা করছেন যে আপনি ওরিয়েন্টেশন পরিবর্তনটি পরিচালনা করবেন যার অর্থ আপনি ল্যান্ডস্কেপটিতে স্যুইচ করার পরে আপনার কার্যকলাপটি পুনরায় তৈরি করা হবে না Instead পরিবর্তে, onConfigrationChanged বলা হয় If যদি এটি অনাকাঙ্ক্ষিত হয় , আপনি যদিও onPause (উদাহরণস্বরূপ) পরীক্ষা করতে আপনার কার্যকলাপের স্থিতিবিন্যাস এবং প্রত্যেক সময় আপনি হয়ে যেতে মনে রাখবেন একটি ভেরিয়েবল ব্যবহার করে স্থিতিবিন্যাস পরিবর্তন হয়েনি পারে।
এলেনা

14
যদি আপনি এপিআই লেভেল 13 (3.2) বা এর চেয়ে বেশি বিকাশের জন্য বিকাশ করে থাকেন তবে আপনার অ্যান্ড্রয়েড: কনফিগারেশন = "ওরিয়েন্টেশন | স্ক্রিন সাইজ" উল্লেখ করা উচিত, অন্যথায় onCfigrationChanged বলা হবে না: developer.android.com/guide/topics/resources/…
আরে

1
হাই, আমি এপিআই 10 (অ্যান্ড্রয়েড 2.3.3) দিয়ে আমার অ্যাপটি তৈরি করছি। এবং যখন আমি অ্যান্ড্রয়েড ব্যবহার করি তখন এটি ওরিয়েন্টেশনটি পুরোপুরি স্বীকৃতি দেয়: configChanges = "ওরিয়েন্টেশন | কীবোর্ডহিডেন"। তবে আমার নেক্সাস এস যা অ্যান্ড্রয়েড ৪.১.২ চালায় ওরিয়েন্টেশন পরিবর্তনটি সনাক্ত করে না i আমি কী করব?
কার্তিক অন্ধমিল

2
অ্যান্ড্রয়েড ব্যবহার করুন : কনফিগারেশন = "ওরিয়েন্টেশন | স্ক্রিনসাইজ" এর পরিবর্তে অ্যান্ড্রয়েড: কনফিগারেশন = "ওরিয়েন্টেশন | কীবোর্ডহাইডান" আপনার ম্যানিফেস্ট ফাইলটিতে এবং পরীক্ষা করুন ... !!!
দীনেশ শর্মা

15

মধ্যে লেআউট লোড জন্য বিন্যাস জমি ফোল্ডারের মানে কি দুটি পৃথক বিন্যাস তারপর আপনি করতে হবে setContentViewonConfigurationChangedপদ্ধতি।

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        setContentView(R.layout.yourxmlinlayout-land);
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        setContentView(R.layout.yourxmlinlayoutfolder);
    }
}

আপনার যদি একটি মাত্র বিন্যাস থাকে তবে এই পদ্ধতিতে সেটকন্টেন্টভিউ তৈরি করার প্রয়োজন নেই। কেবল

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

19
ওভাররাইডের পরিবর্তে, কেবল বিন্যাস / মেইন.এক্সএমএল এবং লেআউট-ল্যান্ড / মেইন.এক্সএমএল ব্যবহার করুন।
জ্যারেড বুরোজ

@JaredBurrows: দয়া করে দেখতে stackoverflow.com/questions/23789605/...
বি ক্লে শ্যানন

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

recreate()পদ্ধতির সাথে একটি সমস্যা হ'ল এটির ফলে স্ক্রিনটি সংক্ষিপ্তভাবে কালো ফ্ল্যাশ হয়ে যায়। এই কারণে আমি আরেকটি পদ্ধতির ব্যবহার করেছি: (1) স্ক্রিনের প্রস্থটি এর মধ্যে সংরক্ষণ করুন onCreate(...), (2) ক্রিয়াকলাপটি বন্ধ হয়ে যাওয়ার সময় কোনও জীবনচক্র পদ্ধতিতে সংরক্ষিত স্ক্রিনের প্রস্থের বর্তমান পর্দার প্রস্থের সাথে তুলনা করুন (উদাঃ onSaveInstanceState(...))।
ধাঁধা

13

কনফিগারেশনের পরিবর্তনের পরে আপনার সমস্ত বান্ডিল সংরক্ষণ করার জন্য আপনাকে কেবল একটি উপায় দেখাতে চেয়েছিল:

আপনার ক্লাসের ঠিক পরে নতুন বান্ডিল তৈরি করুন:

public class MainActivity extends Activity {
    Bundle newBundy = new Bundle();

এরপরে, "সুরক্ষিত শূন্য অনকারেট" এর পরে এটি যুক্ত করুন:

@Override
public void onConfigurationChanged(Configuration newConfig) {
     super.onConfigurationChanged(newConfig);
     if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            onSaveInstanceState(newBundy);
        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
            onSaveInstanceState(newBundy);
        }
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putBundle("newBundy", newBundy);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    savedInstanceState.getBundle("newBundy");
}

আপনি যদি এগুলি যুক্ত করেন তবে আপনার সমস্ত ক্র্যাকৃত ক্লাসগুলি মেইনএকটিভিটির মধ্যে সংরক্ষণ করা হবে।

তবে সর্বোত্তম উপায় হ'ল এটি আপনার অ্যান্ড্রয়েড ম্যানিফেস্টে যুক্ত করা:

<activity name= ".MainActivity" android:configChanges="orientation|screenSize"/>

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

5

এই পদ্ধতি ব্যবহার করুন

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT)
    {
        Toast.makeText(getActivity(),"PORTRAIT",Toast.LENGTH_LONG).show();
       //add your code what you want to do when screen on PORTRAIT MODE
    }
    else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)
    {
        Toast.makeText(getActivity(),"LANDSCAPE",Toast.LENGTH_LONG).show();
        //add your code what you want to do when screen on LANDSCAPE MODE
   }
}

এবং এটি আপনার Androidmainfest.xML এ যুক্ত করতে ভুলবেন না

android:configChanges="orientation|screenSize"

এটার মত

<activity android:name=".MainActivity"
          android:theme="@style/Theme.AppCompat.NoActionBar"
          android:configChanges="orientation|screenSize">

    </activity>

2

ওভাররাইড ক্রিয়াকলাপের পদ্ধতিটি কনফিগারেশন পরিবর্তন হয়েছে


আমি উল্লেখ করতে চাই যে ম্যানিফেস্টে <activity> ট্যাগের অভ্যন্তরে নিম্নলিখিত লাইনটি ব্যতীত, কনফিগারেশন-চেঞ্জড () কল ব্যাকটি ট্রিগারও হয়ে উঠবে না। অ্যান্ড্রয়েড: কনফিগারেশন = "ওরিয়েন্টেশন"
শ্রীকান্ত করুণাঘাট

1

আমি কেবলমাত্র একটি বিকল্প প্রস্তাব করতে চাই যা আপনারা কিছু লোককে উদ্বেগিত করবে, সত্যই, উপরে বর্ণিত হিসাবে:

android:configChanges="orientation|keyboardHidden" 

ইঙ্গিত দেয় যে আমরা স্পষ্টভাবে ইনজেকশনের লেআউটটি ঘোষণা করি।

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

    if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
        getSupportActionBar().hide();

    } else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
        getSupportActionBar().show();
    }

এখানে, আমরা ফোনের অরিয়েন্টেশনের উপর নির্ভর করে অ্যাকশনবারটি প্রদর্শন করি বা করি না


0

OrientationEventListenerশ্রেণীর উদাহরণ তৈরি করুন এবং এটি সক্ষম করুন।

OrientationEventListener mOrientationEventListener = new OrientationEventListener(YourActivity.this) {
    @Override
    public void onOrientationChanged(int orientation) {
        Log.d(TAG,"orientation = " + orientation);
    }
};

if (mOrientationEventListener.canDetectOrientation())
    mOrientationEventListener.enable();

2
আপনার উত্তর ভাঙচুর করবেন না দয়া করে। আপনি যদি এটি মুছতে চান তবে আপনি নিজের উত্তরের নীচে বামদিকে মুছুন বোতামটি খুঁজে পেতে পারেন।
CalvT

0

যদি গৃহীত উত্তরটি আপনার পক্ষে কাজ করে না, তা নিশ্চিত করুন যে আপনি ম্যানিফেস্ট ফাইলে সংজ্ঞায়িত করেন নি:

android:screenOrientation="portrait"

যা আমার ক্ষেত্রে।


0

যদি এটি কিছু নতুন দেবের কাজে আসে তবে এটি উপরে বর্ণিত নয়। খুব স্পষ্টভাবে বলতে গেলে:

কনফিগারেশন চেঞ্জ করা থাকলে আপনার দুটি জিনিস দরকার :

  1. onConfigurationChangedআপনার ক্রিয়াকলাপ শ্রেণিতে একটি পদ্ধতি

  2. আপনার পদ্ধতিতে কোন কনফিগারেশন পরিবর্তনগুলি পরিচালনা করা হবে তা আপনার ম্যানিফেস্টে উল্লেখ করুনonConfigurationChanged

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

<activity name= ".MainActivity" android:configChanges="orientation|screenSize"/>

উপরোক্ত ম্যানিফেস্ট এন্ট্রিতে, বিভিন্ন অ্যান্ড্রয়েড ক্রিয়া রয়েছে android:configChanges=""যার জন্য আপনার ক্রিয়াকলাপটি লাইফসাইলে অনক্রিটকে ট্রিগার করতে পারে।

এটি অত্যন্ত গুরুত্বপূর্ণ - ম্যানিফেস্টে নির্দিষ্ট নয় এমনগুলি হ'ল যা আপনার অনক্রিটকে ট্রিগার করে এবং ম্যানিফেস্টে নির্দিষ্ট onConfigurationChangedহওয়াগুলি হ'ল এটি আপনার ক্রিয়াকলাপ শ্রেণিতে আপনার পদ্ধতিটি ট্রিগার করে

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

<activity name= ".MainActivity" android:configChanges="screenLayout|touchscreen|mnc|mcc|density|uiMode|fontScale|orientation|keyboard|layoutDirection|locale|navigation|smallestScreenSize|keyboardHidden|colorMode|screenSize"/>

এখন স্পষ্টতই আমি সবকিছু পরিচালনা করতে চাই না, তাই আমি একবারে উপরের বিকল্পগুলি অপসারণ শুরু করেছি। প্রতিটি অপসারণের পরে আমার অ্যাপ্লিকেশনটি পুনর্নির্মাণ এবং পরীক্ষণ।

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

আমি 3 টি দিয়ে শেষ করেছিলাম যা মূলত অনক্রিটকে ট্রিগার করেছিল, তারপরে আমি একটি এস 10 + তে পরীক্ষা করেছিলাম এবং আমি এখনও অনক্রিট পেয়ে যাচ্ছিলাম, তাই আমাকে আবার আমার নির্মূলের মহড়াটি করতে হয়েছিল এবং আমারও এটির দরকার ছিল |screenSize। সুতরাং প্ল্যাটফর্মের একটি নির্বাচন পরীক্ষা করুন।

<activity name= ".MainActivity" android:configChanges="screenLayout|uiMode|orientation|screenSize"/>

সুতরাং আমার পরামর্শ, যদিও আমি নিশ্চিত যে এটির মধ্যে কেউ ছিদ্র করতে পারে:

  1. onConfigurationChangedএকটি টোস্ট বা এলওজি দিয়ে আপনার ক্রিয়াকলাপ শ্রেণিতে আপনার পদ্ধতিটি যুক্ত করুন যাতে এটি কখন কাজ করে তা আপনি দেখতে পারেন।

  2. আপনার ম্যানিফেস্টে সমস্ত সম্ভাব্য কনফিগারেশন বিকল্প যুক্ত করুন।

  3. onConfigurationChangedআপনার অ্যাপটি পরীক্ষা করে আপনার পদ্ধতিটি কাজ করছে তা নিশ্চিত করুন।

  4. প্রত্যেকের পরে আপনার অ্যাপ্লিকেশনটি পরীক্ষা করে একবারে আপনার ম্যানিফেস্ট ফাইল থেকে প্রতিটি কনফিগার বিকল্প অপসারণ করুন।

  5. যতটা সম্ভব বড় বড় বিভিন্ন ডিভাইস পরীক্ষা করুন।

  6. উপরে আমার স্নিপেটটি আপনার ম্যানিফেস্ট ফাইলটিতে কপি / পেস্ট করবেন না। অ্যান্ড্রয়েড আপডেটগুলি তালিকা পরিবর্তন করে, তাই আপনি সেগুলি পেয়েছেন তা নিশ্চিত করতে পপ-আউট অ্যান্ড্রয়েড স্টুডিও ইঙ্গিতগুলি ব্যবহার করুন।

আমি আশা করি এটি কারও কিছুটা সময় সাশ্রয় করেছে।

আমার onConfigurationChangedপদ্ধতিটি কেবল নীচের তথ্যের জন্য। নতুন অভিযোজন উপলব্ধ হওয়ার পরেonConfigurationChanged লাইফসাইকেলে ডাকা হয় তবে ইউআই পুনরায় তৈরি করার আগে । সুতরাং ওরিয়েন্টেশনটি পরীক্ষা করার জন্য আমার প্রথমটি সঠিকভাবে কাজ করে এবং তারপরে ২ য় নেস্টেড আমার ইউআই ইমেজভিউয়ের দৃশ্যমানতাটিও সঠিকভাবে কাজ করে।ifif

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);

        // Checks the orientation of the screen
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            pokerCardLarge = findViewById(R.id.pokerCardLgImageView);

            if(pokerCardLarge.getVisibility() == pokerCardLarge.VISIBLE){
                Bitmap image = ((BitmapDrawable)pokerCardLarge.getDrawable()).getBitmap();
                pokerCardLarge.setVisibility(pokerCardLarge.VISIBLE);
                pokerCardLarge.setImageBitmap(image);
            }

        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
            pokerCardLarge = findViewById(R.id.pokerCardLgImageView);

            if(pokerCardLarge.getVisibility() == pokerCardLarge.VISIBLE){
                Bitmap image = ((BitmapDrawable)pokerCardLarge.getDrawable()).getBitmap();
                pokerCardLarge.setVisibility(pokerCardLarge.VISIBLE);
                pokerCardLarge.setImageBitmap(image);
            }

        }
    }

0

সহজ আকারে কোটিলিন বাস্তবায়নের জন্য - পোর্ট্রেট থেকে পর্দার পরিবর্তন ঘটে কেবল তখনই আগুন লাগে <--> ডিভাইসটির প্রয়োজন হলে একটি ফ্লিপ সনাক্তকরণ (180 ডিগ্রি) আপনাকে মাধ্যাকর্ষণ সংবেদনের মানগুলিতে ট্যাব করতে হবে need

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

val rotation = windowManager.defaultDisplay.rotation

    when (rotation) {            
        0 -> Log.d(TAG,"at zero degree")
        1 -> Log.d(TAG,"at 270 degree")
        2 -> Log.d(TAG,"at 180 degree")
        3 -> Log.d(TAG,"at 90 degree")


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