যখন স্ক্রিনটি ঘোরানো হয় তখন আমার কেবল পরিবর্তন করার দরকার নেই। আমার অ্যাপ্লিকেশনটি এলোমেলো চিত্র প্রদর্শন করে যখন এটি যখন প্রথম লোড হয় এবং ঘোরানো হয় তখন অন্য কোনও এলোমেলো চিত্র নির্বাচন করা উচিত নয় । আমি কীভাবে (সহজভাবে) এই আচরণ বন্ধ করতে পারি?
যখন স্ক্রিনটি ঘোরানো হয় তখন আমার কেবল পরিবর্তন করার দরকার নেই। আমার অ্যাপ্লিকেশনটি এলোমেলো চিত্র প্রদর্শন করে যখন এটি যখন প্রথম লোড হয় এবং ঘোরানো হয় তখন অন্য কোনও এলোমেলো চিত্র নির্বাচন করা উচিত নয় । আমি কীভাবে (সহজভাবে) এই আচরণ বন্ধ করতে পারি?
উত্তর:
এটি করার জন্য সাধারণত তিনটি উপায় রয়েছে:
উত্তরগুলির মধ্যে কয়েকটি প্রস্তাবিত হিসাবে, আপনি আপনার ক্রিয়াকলাপের ঘটনা প্রথমবারের জন্য তৈরি করা হয়েছে এবং সেখান থেকে পুনরুদ্ধার করার বিষয়টি আলাদা করতে পারেন savedInstanceState। এটি onSaveInstanceStateপরামিতিগুলি ওভাররাইড করে এবং পরীক্ষা করে করা হয় onCreate।
আপনি আপনার ম্যানিফেস্টে android:screenOrientation="portrait"(বা "landscape") যোগ করে একমুখীকরণে কার্যকলাপটি লক করতে পারেন <activity>।
আপনি ট্যাগটিতে উল্লেখ android:configChanges="orientation|screenSize"করে আপনার নিজের জন্য পর্দার পরিবর্তনগুলি পরিচালনা করতে বোঝাতে পারেন system <activity>এইভাবে ক্রিয়াকলাপটি পুনরায় তৈরি করা হবে না, তবে পরিবর্তে একটি কলব্যাক পাবেন (যা আপনার পক্ষে উপকারী না বলে আপনি তা উপেক্ষা করতে পারেন)।
ব্যক্তিগতভাবে আমি সাথে যেতে হবে (3)। অবশ্যই যদি কোনও একটি ওরিয়েন্টেশনটিতে অ্যাপ্লিকেশনটি লক করা আপনার সাথে ভাল হয় তবে আপনি (2) এর সাথেও যেতে পারেন।
android:configChanges="orientation|screenSize"
android:configChanges="orientation|screenSize"আমার জন্য কাজ কর. ধন্যবাদ @ পেসারিয়র
android:configChanges="orientation|screenSize"এপিআই> = 13 এর মান সহ , কারণ প্রচুর লোক আপনার উত্তরটিকে প্রধান হিসাবে দেখেন!
শিওনের উত্তরটি নিকটে ছিল, তবে 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
android:configChanges="orientation|screenSize"
আপনাকে কেবল AndroidManifest.xmlএবং ভিতরে প্রবেশ করতে হবে বা আপনার ক্রিয়াকলাপগুলির লেবেলে যেতে হবে, যখনই কেউ বলেছেন, আপনাকে কোডের এই লাইনটি টাইপ করতে হবে:
android:configChanges="orientation|screenSize"
সুতরাং, আপনার এই জাতীয় কিছু থাকবে:
<activity android:name="ActivityMenu"
android:configChanges="orientation|screenSize">
</activity>
আশা করি এটা কাজ করবে!
<activity android:name="com.example.abc"
android:configChanges="orientation|screenSize"></activity>
শুধু যোগ কর android:configChanges="orientation|screenSize"মেনিফেস্ট ফাইলের কার্যকলাপ ট্যাবে করুন।
সুতরাং, অভিমুখীকরণ পরিবর্তিত হলে কার্যকলাপ পুনরায় আরম্ভ হবে না।
onSaveInstanceState()এবং onCreate()।
এটি আমার অভিজ্ঞতা যে অ-ডিফল্ট আচরণকে জুতো দেওয়ার চেষ্টা করার পরিবর্তে ওরিয়েন্টেশন পরিবর্তনের সাথে সঠিকভাবে মোকাবেলা করা ভাল।
আপনার বর্তমানে প্রদর্শিত চিত্রটি সংরক্ষণ করা উচিত onSaveInstanceState()এবং আপনার অ্যাপ্লিকেশনটি onCreate()আবার চলতে থাকলে সঠিকভাবে পুনরুদ্ধার করা উচিত ।
android:configChangesএড়ানো উচিত এবং শুধুমাত্র একটি শেষ অবলম্বন হিসেবে ব্যবহার অনুগ্রহ করে পড়ুন। রানটাইম পরিবর্তনসমূহ পরিচালনা একটি কনফিগারেশন পরিবর্তনের কারণে কিভাবে সঠিকভাবে একটি সিস্টেম আরম্ভ করার হ্যান্ডেল করতে আরো তথ্যের জন্য।"
এই সমাধানটি এখন পর্যন্ত সবচেয়ে ভাল কাজ করছে। আপনার ম্যানিফেস্ট ফাইল অ্যাড
<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
}
}
ম্যানিফেস্টে সমস্ত অ্যাপ্লিকেশন কার্যকলাপ ট্যাগের android:configChanges="keyboardHidden|orientation|screenSize"জন্য যুক্ত করুন ।
শুধু এটি আপনার যুক্ত করুন AndroidManifest.xml
<activity android:screenOrientation="landscape">
মানে, একটি ক্রিয়াকলাপ ট্যাগ রয়েছে, এটি অন্য প্যারামিটার হিসাবে যুক্ত করুন। যদি আপনার প্রতিকৃতি নির্দেশের প্রয়োজন হয় তবে ল্যান্ডস্কেপকে প্রতিকৃতিতে পরিবর্তন করুন। আশাকরি এটা সাহায্য করবে.
ম্যানিফিস্ট ফাইলটিতে প্রতিটি ক্রিয়াকলাপে এটি যুক্ত করুন। এইটা সাহায্য করবে
android:configChanges = "orientation|keyboard|keyboardHidden|screenLayout|screenSize"
http://animeshrivastava.blogspot.in/2017/08/activity-lifecycle-oncreate-beating_3.html
@Override
protected void onSaveInstanceState(Bundle b)
{
super.onSaveInstanceState(b);
String str="Screen Change="+String.valueOf(screenChange)+"....";
Toast.makeText(ctx,str+"You are changing orientation...",Toast.LENGTH_SHORT).show();
screenChange=true;
}
আপনার ইমেজ বিবরণ সংরক্ষণ করুন onPause()অথবা onStop()এবং এটি ব্যবহার onCreate(Bundle savedInstanceState)ইমেজ পুনরুদ্ধার করতে।
সম্পাদনা করুন:
আসল প্রক্রিয়া সম্পর্কে আরও তথ্যের এখানে বিস্তারিত বলা হয়েছে http://developer.android.com/references/android/app/Activity.html# ক্রিয়াকলাপটি পূর্ববর্তী অ্যান্ড্রয়েড সংস্করণগুলির তুলনায় হ্যানিকম্বের চেয়ে আলাদা।
শুধু ব্যবহার করুন: android:configChanges="keyboardHidden|orientation"
পেসারিয়ার হিসাবে উল্লেখ করা হয়েছে,
android:configChanges="orientation|screenSize"
আমি সেরা সমাধান কিনা তা জানি না তবে আমি এটি এখানে বর্ণনা করি:
প্রথমত, আপনার ক্লাসের সাথে শংসাপত্রের প্রয়োজন আপনার অ্যাপ্লিকেশনটির আবেদন এটির প্রকাশ্যে রয়েছে:
<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);
}
আমি জানি না এটি সবচেয়ে মার্জিত এবং সুন্দর সমাধান কিনা, তবে কমপক্ষে এখানে এটি কার্যকরী :)
এতে onCreateথাকা আপনার ক্রিয়াকলাপটিতে, পদ্ধতির পরে এই কোডটি যুক্ত করুনWebView
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle state) {
super.onRestoreInstanceState(state);
}
Screen.lockOrientation(this)থেকে কল করুন । এটি আনলক করার অনুমতি দেয় যা ম্যানিফেস্টটি না করে।