অভিমুখ পরিবর্তন হলে অ্যাপ্লিকেশনটি পুনরায় লোড করবেন না


152

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


1
কোড থেকে স্ক্রিন ওরিয়েন্টেশন লক করাও (এবং সম্ভবত আনলক করা )ও সম্ভব। এর জন্য কেবল github.com/delight-im/Android-BaseLib/blob/master/Source/src/im/…Screen.lockOrientation(this) থেকে কল করুন । এটি আনলক করার অনুমতি দেয় যা ম্যানিফেস্টটি না করে।
কাবা

@ এসকোবার সিলেজার এই প্রশ্নের সঠিক সমাধান কী। তবে আমার একই চাহিদা রয়েছে।
প্রবস

আমি কোডে এই প্রোগ্রামটিমেটিকভাবে করতে চাই।
পলারিস

উত্তর:


249

এটি করার জন্য সাধারণত তিনটি উপায় রয়েছে:

  1. উত্তরগুলির মধ্যে কয়েকটি প্রস্তাবিত হিসাবে, আপনি আপনার ক্রিয়াকলাপের ঘটনা প্রথমবারের জন্য তৈরি করা হয়েছে এবং সেখান থেকে পুনরুদ্ধার করার বিষয়টি আলাদা করতে পারেন savedInstanceState। এটি onSaveInstanceStateপরামিতিগুলি ওভাররাইড করে এবং পরীক্ষা করে করা হয় onCreate

  2. আপনি আপনার ম্যানিফেস্টে android:screenOrientation="portrait"(বা "landscape") যোগ করে একমুখীকরণে কার্যকলাপটি লক করতে পারেন <activity>

  3. আপনি ট্যাগটিতে উল্লেখ android:configChanges="orientation|screenSize"করে আপনার নিজের জন্য পর্দার পরিবর্তনগুলি পরিচালনা করতে বোঝাতে পারেন system <activity>এইভাবে ক্রিয়াকলাপটি পুনরায় তৈরি করা হবে না, তবে পরিবর্তে একটি কলব্যাক পাবেন (যা আপনার পক্ষে উপকারী না বলে আপনি তা উপেক্ষা করতে পারেন)।

ব্যক্তিগতভাবে আমি সাথে যেতে হবে (3)। অবশ্যই যদি কোনও একটি ওরিয়েন্টেশনটিতে অ্যাপ্লিকেশনটি লক করা আপনার সাথে ভাল হয় তবে আপনি (2) এর সাথেও যেতে পারেন।


13
সুতরাং # 3 এর জন্য আপনি কি বলছেন যে আমাকে যা করতে হবে তা হল আমার ম্যানিফেস্টে লাইনটি যুক্ত করা? কারণ এটি কাজ করে না।
জিমি ডি


16
@ এস্কোবার সিলেসার, অ্যান্ড্রয়েড ৩.২ এবং তারপরের জন্য আপনার প্রয়োজনandroid:configChanges="orientation|screenSize"
পেসারিয়ার

9
android:configChanges="orientation|screenSize"আমার জন্য কাজ কর. ধন্যবাদ @ পেসারিয়র
ডন

1
দয়া করে আপনার উত্তর কেস # 3 আপডেট করুন android:configChanges="orientation|screenSize"এপিআই> = 13 এর মান সহ , কারণ প্রচুর লোক আপনার উত্তরটিকে প্রধান হিসাবে দেখেন!
র‌াদিস্তো

215

শিওনের উত্তরটি নিকটে ছিল, তবে android:configChanes="orientation"অ্যাপ্লিকেশনটির 12 টি বা এর চেয়ে কম এপিআই স্তর না থাকলে # 3 ( ) কাজ করবে না।

১৩ বা তদূর্ধের এপিআই স্তরে, ওরিয়েন্টেশন পরিবর্তন হওয়ার সাথে সাথে স্ক্রিনের আকার পরিবর্তন হয়, সুতরাং এটি এখনও ক্রিয়াকলাপটিকে ধ্বংস করতে এবং অভিমুখীকরণ পরিবর্তন করার সাথে সাথে শুরু করে।

আমি নীচের মতো করে কেবল "স্ক্রিনসাইজ" বৈশিষ্ট্য যুক্ত করুন:

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

এখন, আপনি যখন ওরিয়েন্টেশন পরিবর্তন করেন (এবং স্ক্রিনের আকার পরিবর্তন হয়) তখন কার্যকলাপটি তার অবস্থা ধরে রাখে এবং onConfigurationChanged()তাকে ডাকা হয়। ওরিয়েন্টেশন পরিবর্তিত হলে এটি স্ক্রিনে থাকা সমস্ত কিছুকে (যেমন: একটি ওয়েবভিউতে ওয়েবপৃষ্ঠায়) রাখবে।

এই সাইট থেকে এটি শিখেছি: http://developer.android.com/guide/topics/manifest/activity-element.html

এছাড়াও, এটি আপাতদৃষ্টিতে একটি খারাপ অভ্যাস তাই রানটাইম পরিবর্তনগুলি পরিচালনা করার বিষয়ে নীচের লিঙ্কটি পড়ুন:

http://developer.android.com/guide/topics/resources/runtime-changes.html


2
ধন্যবাদ ... "ওরিয়েন্টেশন" দিয়ে "স্ক্রিন সাইজ" যুক্ত করার পরে এর কাজ
প্রতীক

স্যামসাং গ্যালাক্সি নেক্সাস অ্যান্ড্রয়েডে কাজ করে 4.2.1! android:configChanges="orientation|screenSize"
ভিনসেন্ট ডাকাস্টেল

অ্যামেজিং। ক্রিয়াকলাপ পুনরায় লোডিং এবং প্রথম থেকেই শুরু হওয়া একটি ভিডিও নিয়ে আমার যে সমস্যা ছিল তা সমাধান করার জন্য কোডের মাধ্যমে এত ঘন্টা কাজ করে যাচ্ছি। এবং এখানে সমাধান ছিল! ++++ 1
ম্যাথিয়াস অ্যাসবার্গ

6
খারাপ অনুশীলন? পিএফটি, বাস্তব জীবনের মানুষের সময়সীমা রয়েছে এবং এটি যদি কাজ করে তবে তা কার্যকর হয়;)
কেসি

যদি এটি একটি খারাপ অভ্যাস হয় তবে কেন এটি এত উত্সাহ পেল ??
তীক্ষ্ণ প্রান্ত

26

আপনাকে কেবল AndroidManifest.xmlএবং ভিতরে প্রবেশ করতে হবে বা আপনার ক্রিয়াকলাপগুলির লেবেলে যেতে হবে, যখনই কেউ বলেছেন, আপনাকে কোডের এই লাইনটি টাইপ করতে হবে:

android:configChanges="orientation|screenSize"

সুতরাং, আপনার এই জাতীয় কিছু থাকবে:

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

আশা করি এটা কাজ করবে!


এটি আমার লেআউট-স্থল বিন্যাস লোড করছে না। :( আমার পক্ষে কাজ করেনি
piyush poraya

16
<activity android:name="com.example.abc" 
 android:configChanges="orientation|screenSize"></activity>

শুধু যোগ কর android:configChanges="orientation|screenSize"মেনিফেস্ট ফাইলের কার্যকলাপ ট্যাবে করুন।

সুতরাং, অভিমুখীকরণ পরিবর্তিত হলে কার্যকলাপ পুনরায় আরম্ভ হবে না।


ইহা কাজ করছে. তবে আমি যখন প্রতিটি ওরিয়েন্টেশন লেআউট.এক্সএমএল এবং লেআউট-ল্যান্ড.এক্সএমএল জন্য পৃথক বিন্যাস ব্যবহার করছি। উভয় দিকনির্দেশের জন্য এটির প্রয়োগ ল্যান্ডস্কেপ বিন্যাস। আমি যদি কেবল "ওরিয়েন্টেশন" ব্যবহার করি তবে এটি যা প্রত্যাশা করে তা আবার লোড হচ্ছে। আপনি এই সাহায্য করতে পারেন?
কার্তিতেকান Ve

1
আপনি যখন প্রতারণা করার চেষ্টা করছেন তখন কার্তিকেইয়ানভি এটিই সমস্যা। আপনি করব আছে লেআউট পরিবর্তন করুন আপনার কার্যকলাপ পুনরায় আরম্ভ করা। এগিয়ে যান এবং কেবল আসল সমাধানটি ব্যবহার করুন, যা ব্যবহার করছে onSaveInstanceState()এবং onCreate()
মার্ক প্লানো-লেসে

@ মারকপ্লাণো-লেসে এবং আমি কীভাবে এটি অনুমান করি?
আহসান

@ ওয়েইবুও আসল সমাধানটি প্রশ্নের সাথে যুক্ত রয়েছে: developer.android.com/guide/topics/resources/…
মার্ক প্লানো-লেসে

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

10

এটি আমার অভিজ্ঞতা যে অ-ডিফল্ট আচরণকে জুতো দেওয়ার চেষ্টা করার পরিবর্তে ওরিয়েন্টেশন পরিবর্তনের সাথে সঠিকভাবে মোকাবেলা করা ভাল।

আপনার বর্তমানে প্রদর্শিত চিত্রটি সংরক্ষণ করা উচিত onSaveInstanceState()এবং আপনার অ্যাপ্লিকেশনটি onCreate()আবার চলতে থাকলে সঠিকভাবে পুনরুদ্ধার করা উচিত ।


# 3 একটি পুরোপুরি বৈধ সমাধান। এই সঠিক সমস্যাটি সমাধান করার জন্য এটি সঠিক সরঞ্জাম। আপনি কেন বলছেন যে এটি জুতো সকাল?
পেসারিয়ার

1
@ পেয়ারিয়ার সবেমাত্র ডক্সটি পড়ুন। "নোট: ব্যবহার android:configChangesএড়ানো উচিত এবং শুধুমাত্র একটি শেষ অবলম্বন হিসেবে ব্যবহার অনুগ্রহ করে পড়ুন। রানটাইম পরিবর্তনসমূহ পরিচালনা একটি কনফিগারেশন পরিবর্তনের কারণে কিভাবে সঠিকভাবে একটি সিস্টেম আরম্ভ করার হ্যান্ডেল করতে আরো তথ্যের জন্য।"
মার্ক প্লানো-লেসেই

আপনি সংরক্ষণ এবং পুনরুদ্ধার একটি উদাহরণ পোস্ট করতে পারে।
পলারিস

6

এই সমাধানটি এখন পর্যন্ত সবচেয়ে ভাল কাজ করছে। আপনার ম্যানিফেস্ট ফাইল অ্যাড

<activity
    android:configChanges="keyboardHidden|orientation|screenSize"
    android:name="your activity name"
    android:label="@string/app_name" 
    android:screenOrientation="landscape">
  </activity

এবং আপনার ক্রিয়াকলাপ শ্রেণিতে নিম্নলিখিত কোড যুক্ত করুন

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

    }
}

4

ম্যানিফেস্টে সমস্ত অ্যাপ্লিকেশন কার্যকলাপ ট্যাগের android:configChanges="keyboardHidden|orientation|screenSize"জন্য যুক্ত করুন ।


3

শুধু এটি আপনার যুক্ত করুন AndroidManifest.xml

<activity android:screenOrientation="landscape">

মানে, একটি ক্রিয়াকলাপ ট্যাগ রয়েছে, এটি অন্য প্যারামিটার হিসাবে যুক্ত করুন। যদি আপনার প্রতিকৃতি নির্দেশের প্রয়োজন হয় তবে ল্যান্ডস্কেপকে প্রতিকৃতিতে পরিবর্তন করুন। আশাকরি এটা সাহায্য করবে.


আমি স্ক্রিনটি ঘোরানোর ক্ষমতা কেড়ে নিতে চাইছি না। আমি উল্লিখিত হিসাবে আমার অ্যাপটি পুনরায় লোড করা চাই না ...
জিমি ডি

PS ... এটি যাইহোক কাজ করে না। এটি কেবল অ্যাপ্লিকেশনটিকে একটি নির্দিষ্ট অভিযোজনে প্রদর্শন করতে বাধ্য করে। স্ক্রিনটি ঘোরানো এখনও ক্রিয়াকলাপটি পুনরায় লোড করে
জিমি ডি

3

ম্যানিফিস্ট ফাইলটিতে প্রতিটি ক্রিয়াকলাপে এটি যুক্ত করুন। এইটা সাহায্য করবে

android:configChanges = "orientation|keyboard|keyboardHidden|screenLayout|screenSize"

স্ক্রিনআউটআউট আমার জন্য কাজ করেছে, অ্যান্ড্রয়েডে স্প্লিটস্ক্রিনের জন্য অ্যাপ্লিকেশনটি পুনরায় আকার দেওয়ার সময় রিফ্রেশ প্রতিরোধ করেছে
টেরেন

2

উপরের সমস্ত উত্তর আমার পক্ষে কাজ করছে না। সুতরাং, আমি উল্লেখ করে সমাধান করেছেন labelসঙ্গে screenOrientationনিচের মত। এখন সব ঠিক আছে

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


1

আপনার ইমেজ বিবরণ সংরক্ষণ করুন onPause()অথবা onStop()এবং এটি ব্যবহার onCreate(Bundle savedInstanceState)ইমেজ পুনরুদ্ধার করতে।

সম্পাদনা করুন:

আসল প্রক্রিয়া সম্পর্কে আরও তথ্যের এখানে বিস্তারিত বলা হয়েছে http://developer.android.com/references/android/app/Activity.html# ক্রিয়াকলাপটি পূর্ববর্তী অ্যান্ড্রয়েড সংস্করণগুলির তুলনায় হ্যানিকম্বের চেয়ে আলাদা।


আসলে আপনি পদ্ধতি onSaveInstanceState () এটা কি করা উচিত
উইলি Mentzel



-1

আমি সেরা সমাধান কিনা তা জানি না তবে আমি এটি এখানে বর্ণনা করি:

প্রথমত, আপনার ক্লাসের সাথে শংসাপত্রের প্রয়োজন আপনার অ্যাপ্লিকেশনটির আবেদন এটির প্রকাশ্যে রয়েছে:

<application
    android:name=".App"
    ...

দ্বিতীয়ত, আমার ক্লাস অ্যাপে আমি এটি পছন্দ করেছি:

public class App extends Application {
    public static boolean isOrientationChanged = false;

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public void onConfigurationChanged(@NotNull Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE ||
                newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
            isOrientationChanged = true;
        }
    }

}

তৃতীয়ত, আপনাকে ওরিয়েন্টেশন চেঞ্জে একটি পতাকা সেট করা দরকার, আমার ক্ষেত্রে, অ্যাপ্লিকেশন নেভিগেশনের মধ্যে পূর্ববর্তী ক্রিয়াকলাপটি যখন কল করা হয় তখন আমি সর্বদা এটি সেট করি, সুতরাং পরবর্তী ক্রিয়াকলাপটি তৈরি হওয়ার পরে কেবল একবার ফোন করা।

isOrientationChanged = false;

সুতরাং আমি যখনই এই প্রসঙ্গে আমার পর্দার ওরিয়েন্টেশনটি পরিবর্তন করি তখনই আমি যখনই এই সেটিংটি পরিবর্তন করি তখনই আমি এটি সেট করি, এটি ওরিয়েন্টেশনের কোনও পরিবর্তন আছে কিনা তা পরীক্ষা করে থাকে, যদি তাই হয় তবে এটি পতাকাটির মানের ভিত্তিতে এটি বৈধ করে তোলে।

মূলত, যখনই আমি একটি অ্যাসিনক্রোনাস রিট্রোফিট অনুরোধ করি তখনই আমাকে এটি ব্যবহার করতে হয়েছিল, যা তিনি প্রতিটি মুহুর্তকে অভিযুক্তি পরিবর্তিত করে, ক্রমাগত অ্যাপ্লিকেশনটি ক্র্যাশ করে:

if (!isOrientationChanged) {
    presenter.retrieveAddress(this, idClient, TYPE_ADDRESS);
}

আমি জানি না এটি সবচেয়ে মার্জিত এবং সুন্দর সমাধান কিনা, তবে কমপক্ষে এখানে এটি কার্যকরী :)


-2

এতে onCreateথাকা আপনার ক্রিয়াকলাপটিতে, পদ্ধতির পরে এই কোডটি যুক্ত করুনWebView

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);    
}

@Override
protected void onRestoreInstanceState(Bundle state) {
    super.onRestoreInstanceState(state);    
}

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