আমি চাই ট্যাবলেটগুলি প্রতিকৃতি এবং ল্যান্ডস্কেপ (sw600dp বা তার চেয়েও বেশি) প্রদর্শন করতে সক্ষম হোক, তবে ফোনগুলি কেবল প্রতিকৃতিতে সীমাবদ্ধ রাখে। শর্তসাপেক্ষে ওরিয়েন্টেশন বেছে নেওয়ার কোনও উপায় আমি খুঁজে পাচ্ছি না। কোনও পরামর্শ?
আমি চাই ট্যাবলেটগুলি প্রতিকৃতি এবং ল্যান্ডস্কেপ (sw600dp বা তার চেয়েও বেশি) প্রদর্শন করতে সক্ষম হোক, তবে ফোনগুলি কেবল প্রতিকৃতিতে সীমাবদ্ধ রাখে। শর্তসাপেক্ষে ওরিয়েন্টেশন বেছে নেওয়ার কোনও উপায় আমি খুঁজে পাচ্ছি না। কোনও পরামর্শ?
উত্তর:
সংস্থান এবং আকারের বাছাইকারীদের ব্যবহারের জন্য এখানে একটি ভাল উপায় ।
এই বুল রিসোর্সটিকে পুনরায় / মানগুলিতে bools.xML বা যা কিছু হিসাবে রাখুন (ফাইলের নাম এখানে কিছু আসে না):
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="portrait_only">true</bool>
</resources>
এটিকে res / মান-sw600dp এবং res / মান-এক্সলারেজে রাখুন:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="portrait_only">false</bool>
</resources>
অ্যান্ড্রয়েড স্টুডিওতে এই ডিরেক্টরি এবং ফাইলগুলি যুক্ত করতে সহায়তার জন্য এই পরিপূরক উত্তরটি দেখুন ।
তারপরে, আপনার ক্রিয়াকলাপের ওনক্রিট পদ্ধতিতে আপনি এটি করতে পারেন:
if(getResources().getBoolean(R.bool.portrait_only)){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
সর্বাধিক প্রস্থের দিকের দিকের 600 ডিপি-র বেশি বা পূর্ব-অ্যান্ড্রয়েড 3.2 ডিভাইসগুলিতে এক্স-বৃহত ডিভাইসগুলি (ট্যাবলেটগুলি মূলত) সেন্সর এবং ব্যবহারকারী-লক ঘূর্ণন ইত্যাদির উপর নির্ভর করে স্বাভাবিকের মতো আচরণ করবে । বাকি সমস্ত কিছু (ফোন, বেশ কিছু) কেবল প্রতিকৃতি হবে।
xlarge
খুব বেশি ব্যবহার করা দরকার বা আমি কেবল ব্যবহার করতে পারি sw600dp
? এই দিনগুলিতে সম্ভবত কোনও ট্যাবলেট চলছে << 3.2।
onCreate()
। আমি যখন কলটি সরিয়ে নিয়েছিsetRequestedOrientation()
সময় এবং প্রসঙ্গে আলাদা অবস্থানে নিয়ে গিয়েছিলাম তখন পুনরায় আরম্ভ আর কিছু হয় নি।
আপনি প্রথমে ডিভাইসের স্ক্রিন আকার পেতে এই পদ্ধতিতে চেষ্টা করতে পারেন
if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE) {
Toast.makeText(this, "Large screen",Toast.LENGTH_LONG).show();
}
else if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_NORMAL) {
Toast.makeText(this, "Normal sized screen" , Toast.LENGTH_LONG).show();
}
else if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_SMALL) {
Toast.makeText(this, "Small sized screen" , Toast.LENGTH_LONG).show();
}
else {
Toast.makeText(this, "Screen size is neither large, normal or small" , Toast.LENGTH_LONG).show();
}
এবং তারপরে ওরিয়েন্টেশন সেট করুন
setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
Configuration
উপলব্ধ screenLayout
তথ্য - ডিপিআই। প্রশ্নটি শারীরিক ডিভাইসের স্ক্রিন আকারের সাথে সম্পর্কিত - ফোন ভিএস ট্যাবলেট। অর্থ, আপনার একটি Configuration.SCREENLAYOUT_SIZE_NORMAL
থাকতে পারে এবং এটি এমডিপিআই ট্যাবলেট হতে পারে।
আপনি অ্যান্ড্রয়েড স্টুডিওতে নিম্নলিখিত ফাইলগুলি তাদের ফাইলগুলি res/values-sw600dp
এবং res/values-large
ডিরেক্টরিগুলি যুক্ত করতে পারেন canbools.xml
প্রথমত, প্রকল্প ট্যাব থেকে নেভিগেটরে প্রকল্প (অ্যান্ড্রয়েডের চেয়ে) ফিল্টারটি নির্বাচন করুন।
তারপরে app/src/main/res
ডিরেক্টরিতে ডান ক্লিক করুন । নতুন > অ্যান্ড্রয়েড রিসোর্স ডিরেক্টরি চয়ন করুন ।
ক্ষুদ্রতম পর্দার প্রস্থ নির্বাচন করুন এবং তারপরে >> বোতাম টিপুন।
600
ক্ষুদ্রতম পর্দার প্রস্থের জন্য টাইপ করুন। ডিরেক্টরিটির নামটি স্বয়ংক্রিয়ভাবে উত্পন্ন হবে। ঠিক আসে বল.
তারপরে নতুন তৈরি করা values-sw600dp
ফাইলটিতে রাইট ক্লিক করুন । নতুন > মান সংস্থান ফাইল নির্বাচন করুন । bools
নামের জন্য টাইপ করুন ।
একটি যোগ করার পদ্ধতি values-large
ডিরেক্টরির শুধুমাত্র প্রয়োজনীয় যদি আপনি প্রাক অ্যান্ড্রয়েড 3.2 (API এর স্তর 13) সমর্থন দিয়ে যাচ্ছি। অন্যথায় আপনি এই পদক্ষেপটি এড়িয়ে যেতে পারেন। values-large
ডিরেক্টরি অনুরূপ values-sw600dp
। ( values-xlarge
অনুরূপ values-sw720dp
।)
তৈরি করতে values-large
ডিরেক্টরি, উপরোক্ত হিসাবে একই পদক্ষেপগুলি অনুসরণ করুন, কিন্তু এই ক্ষেত্রে চয়ন সাইজ ক্ষুদ্রতম স্ক্রিন প্রস্থ বদলে। বড় নির্বাচন করুন । ডিরেক্টরিটির নামটি স্বয়ংক্রিয়ভাবে উত্পন্ন হবে।
bools.xml
ফাইলটি তৈরি করতে আগের মতো ডিরেক্টরিতে ডান ক্লিক করুন।
আমি এটি কীভাবে করেছি তা এখানে রয়েছে ( http://androidblogger.blogspot.com/2011/08/orientation-for-both- iPhone-and-tablets.html দ্বারা অনুপ্রাণিত ):
অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএলে, প্রতিটি ক্রিয়াকলাপের জন্য আপনি প্রতিকৃতি এবং ল্যান্ডস্কেপের মধ্যে পরিবর্তন করতে সক্ষম হতে চান (আপনি স্ক্রিন সাইজ যুক্ত করেছেন তা নিশ্চিত করুন - আপনার এটির প্রয়োজন ছিল না!) আপনাকে এখানে স্ক্রিন ওরিয়েন্টেশন সেট করার দরকার নেই। :
android:configChanges="keyboardHidden|orientation|screenSize"
প্রতিটি ক্রিয়াকলাপে যুক্ত করার পদ্ধতি:
public static boolean isXLargeScreen(Context context) {
return (context.getResources().getConfiguration().screenLayout
& Configuration.SCREENLAYOUT_SIZE_MASK)
>= Configuration.SCREENLAYOUT_SIZE_XLARGE;
}
এবং: (আপনি যদি এই পদ্ধতিটিকে ওভাররাইড না করেন, তবে অরিয়েন্টেশন পরিবর্তন করার সময় অ্যাপটি অনক্রিট () কল করবে)
@Override
public void onConfigurationChanged (Configuration newConfig)
{
super.onConfigurationChanged(newConfig);
if (!isXLargeScreen(getApplicationContext()) ) {
return; //keep in portrait mode if a phone
}
//I set background images for landscape and portrait here
}
প্রতিটি ক্রিয়াকলাপের অনক্রিট () তে:
if (!isXLargeScreen(getApplicationContext())) { //set phones to portrait;
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
else {
//I set background images here depending on portrait or landscape orientation
}
ল্যান্ডস্কেপ থেকে প্রতিকৃতি বা বিপরীতে স্যুইচ করার সময় কীভাবে অ্যাপটিকে লেআউট ফাইল পরিবর্তন করতে হবে তা কেবলমাত্র আমি বুঝতে পারি না is আমি ধরে নিয়েছি উত্তরটি উপরের লিঙ্কটি যা কিছু করে তার অনুরূপ কিছু করছে তবে আমি এটি আমার পক্ষে কাজ করতে পারি না - এটি আমার সমস্ত ডেটা মুছে ফেলে। তবে আপনার যদি প্রতিকৃতি এবং ল্যান্ডস্কেপের জন্য একই লেআউট ফাইল রয়েছে এমন একটি সাধারণ পর্যাপ্ত অ্যাপ রয়েছে তবে এটি কাজ করা উচিত।
জিনির উত্তর অনুসরণ করা , আমি মনে করি এটি করার সবচেয়ে নির্ভরযোগ্য উপায়টি নিম্নরূপ:
এখানে বর্ণিত হিসাবে , উত্সগুলিতে একটি বুলিয়ান রাখুন sw600dp। এটা তোলে থাকতে হবে উপসর্গ SW অন্যথায় এটি ঠিকমত কাজ করবে না:
res / মান-sw600dp / dimens.xML এ
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="isTablet">true</bool>
</resources>
res / মান / dimens.xML এ
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="isTablet">false</bool>
</resources>
তারপরে সেই বুলিয়ান পুনরুদ্ধার করার জন্য একটি পদ্ধতি তৈরি করুন:
public class ViewUtils {
public static boolean isTablet(Context context){
return context.getResources().getBoolean(R.bool.isTablet);
}
}
এবং যেখানে আপনি এই আচরণটি চান সেগুলি থেকে বাড়ানোর একটি বেস ক্রিয়াকলাপ:
public abstract class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (!ViewUtils.isTablet(this)) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
}
}
সুতরাং প্রতিটি ক্রিয়াকলাপ বেসঅ্যাক্টিভিটি প্রসারিত করবে:
public class LoginActivity extends BaseActivity //....
গুরুত্বপূর্ণ : এমনকি যদি আপনি প্রসারিত করেন BaseActivity
তবে আপনাকে অবশ্যই আপনার AndroidManLive.xML এর android:configChanges="orientation|screenSize"
প্রত্যেকটিতে লাইন যুক্ত করতে হবে Activity
:
<activity
android:name=".login.LoginActivity"
android:configChanges="orientation|screenSize">
</activity>
ঠিক আছে, এটি বেশ খানিকটা দেরি হলেও, এখানে একটি এক্সএমএল-কেবল তবে একটি হ্যাক সমাধান যা কোনও ক্রিয়াকলাপটিকে পুনরায় তৈরি করে নাsetRequestedOrientation
ওরিয়েন্টেশন পরিবর্তন করতে হবে:
অনুসরণ গৃহীত উত্তর, আমি সমাধান আশা নিয়ে kotlin ফাইল যোগ করার am এটি অন্য কারো সাহায্য করে
এই বুল রিসোর্সটিকে bools.xML বা যা কিছু res/values
হিসাবে রাখুন (ফাইলের নাম এখানে গুরুত্বপূর্ণ নয়):
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="portrait_only">true</bool>
</resources>
এটি একটিতে রাখুন res/values-sw600dp
এবং res/values-sw600dp-land
:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="portrait_only">false</bool>
</resources>
তারপরে, এটি আপনার ক্রিয়াকলাপ বা খণ্ডিতকরণের জন্য নীচের লাইনে যুক্ত করুন
class MyActivity : Activity() {
@SuppressLint("SourceLockedOrientationActivity")
override fun onCreate(savedInstanceState: Bundle?) {
if (resources.getBoolean(R.bool.portrait_only)) {
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
}
super.onCreate(savedInstanceState)
}
@SuppressLint("SourceLockedOrientationActivity")
override fun onConfigurationChanged(newConfig: Configuration) {
if (resources.getBoolean(R.bool.portrait_only)) {
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
}
super.onConfigurationChanged(newConfig)
}
}
অন্যান্য সমাধানগুলি আমার পক্ষে কার্যকর হয়নি। ডায়লগ এবং বিনোদন সংক্রান্ত সমস্যাগুলির সাথে আমার এখনও কিছু অদ্ভুত ওরিয়েন্টেশন সমস্যা ছিল। আমার সমাধানটি ছিল কার্যকলাপকে প্রসারিত করা, এটি প্রকাশ্যে প্রতিকৃতি হিসাবে জোর করে।
উদাহরণ:
public class MainActivityPhone extends MainActivity {}
manifest.xml:
<activity
android:screenOrientation="portrait"
android:name=".MainActivityPhone"
android:theme="@style/AppTheme.NoActionBar" />
স্প্ল্যাশ স্ক্রিন কার্যকলাপে:
Intent i = null;
boolean isTablet = getResources().getBoolean(R.bool.is_tablet);
if (!isTablet)
i = new Intent(this, MainActivityPhone.class);
else
i = new Intent(this, MainActivity.class);
startActivity(i);
পুরানো প্রশ্ন আমি জানি। আপনার অ্যাপ্লিকেশন সর্বদা পোর্ট্রেট মোডে চালানোর জন্য এমনকি অভিমুখীকরণ ইত্যাদি হতে পারে বা অদলবদল করা যেতে পারে ইত্যাদি (উদাহরণস্বরূপ, ট্যাবলেটগুলিতে) আমি এই ফাংশনটি ডিজাইন করেছি যা প্রতিকৃতি এবং ল্যান্ডস্কেপ কীভাবে তা প্রয়োজন ছাড়াই ডান দিকনির্দেশে ডিভাইসটি সেট করতে ব্যবহৃত হয় বৈশিষ্ট্যগুলি ডিভাইসে সংগঠিত হয়।
private void initActivityScreenOrientPortrait()
{
// Avoid screen rotations (use the manifests android:screenOrientation setting)
// Set this to nosensor or potrait
// Set window fullscreen
this.activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
DisplayMetrics metrics = new DisplayMetrics();
this.activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
// Test if it is VISUAL in portrait mode by simply checking it's size
boolean bIsVisualPortrait = ( metrics.heightPixels >= metrics.widthPixels );
if( !bIsVisualPortrait )
{
// Swap the orientation to match the VISUAL portrait mode
if( this.activity.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT )
{ this.activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); }
else { this.activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT ); }
}
else { this.activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); }
}
একটি যাদুমন্ত্র মত কাজ করে!
বিজ্ঞপ্তি: this.activity
আপনার ক্রিয়াকলাপ দ্বারা পরিবর্তন করুন বা এটি মূল this.activity
ক্রিয়ায় যুক্ত করুন এবং সরান ;-)
আপনি যদি বিপরীতটি করতে চান তবে আপনার কোডটি অবশ্যই ল্যান্ডস্কেপে পরিবর্তন করতে হবে (তবে আমি মনে করি এটি কীভাবে এটি পরিষ্কার)।
দুর্ভাগ্যক্রমে, পদ্ধতি সেটরেক্টেড ওরিয়েন্টেশন (...) ব্যবহার করে ফলে ক্রিয়াকলাপটি পুনরায় আরম্ভ হবে, সুতরাং আপনি যদি এটি অনক্রিট পদ্ধতিতে কল করেন তবে এটি ক্রিয়াকলাপের জীবনচক্রের মধ্য দিয়ে যাবে এবং তারপরে অনুরোধের ভিত্তিতে একই ক্রিয়াকলাপটি পুনরায় তৈরি করবে। সুতরাং @ ব্রায়ান ক্রিস্টেনসেনের উত্তরে আপনার বিবেচনা করা উচিত যে ক্রিয়াকলাপটি কোডটি দু'বার কল করা যেতে পারে, এর খারাপ প্রভাব থাকতে পারে (কেবল ভিজ্যুয়াল নয়, নেটওয়ার্ক অনুরোধ, বিশ্লেষণ ইত্যাদি))
তদ্ব্যতীত, ম্যানিফেস্টে কনফিগার চেঞ্জের বৈশিষ্ট্যটি সেট করা আমার মতে একটি বড় বাণিজ্য-বন্ধ, যা প্রচুর রিফ্যাক্টরিং ব্যয় নিতে পারে। অ্যান্ড্রয়েড ডিভস সেই বৈশিষ্ট্যটি পরিবর্তন করার পরামর্শ দিচ্ছে না ।
শেষ অবধি, স্ক্রিন ওরিয়েন্টেশনটি কিছুটা আলাদা করার চেষ্টা করা হয়েছে (পুনরায় আরম্ভের সমস্যা এড়াতে) অসম্ভব, স্থির ম্যানিফেস্টের কারণে স্থায়ীভাবে অসম্ভব যা পরিবর্তন করা যায় না, প্রোগ্রামিকভাবে ইতিমধ্যে শুরু হওয়া ক্রিয়াকলাপে কেবল সেই পদ্ধতিটি কল করা সম্ভব।
সংক্ষিপ্তসার: আমার মতে @ ব্রায়ান ক্রিস্টেনসেন পরামর্শটি সেরা বাণিজ্য বন্ধ, তবে পুনরায় আরম্ভ করার ক্রিয়াকলাপের বিষয়ে সচেতন হন।
layout-land
অভ্যন্তরres
ফোল্ডারটি ব্যবহার করে ।