অ্যান্ড্রয়েড ফোনটি ল্যান্ডস্কেপ বা প্রতিকৃতিতে রয়েছে কিনা আমি কীভাবে তা পরীক্ষা করতে পারি?
অ্যান্ড্রয়েড ফোনটি ল্যান্ডস্কেপ বা প্রতিকৃতিতে রয়েছে কিনা আমি কীভাবে তা পরীক্ষা করতে পারি?
উত্তর:
বর্তমান কনফিগারেশনটি, কোন সংস্থানগুলি পুনরুদ্ধার করতে হবে তা নির্ধারণ করতে ব্যবহৃত হিসাবে, রিসোর্সগুলির Configuration
অবজেক্ট থেকে উপলব্ধ :
getResources().getConfiguration().orientation;
আপনি এর মানটি দেখে ওরিয়েন্টেশনটি পরীক্ষা করতে পারেন:
int orientation = getResources().getConfiguration().orientation;
if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
// In landscape
} else {
// In portrait
}
অ্যান্ড্রয়েড বিকাশকারী আরও তথ্য পাওয়া যাবে ।
android:screenOrientation="portrait"
) লক করে রাখে তবে ব্যবহারকারী কীভাবে ডিভাইসটি ঘোরান তা নির্বিশেষে এই পদ্ধতিটি একই মান প্রদান করবে will সেক্ষেত্রে আপনি সঠিকভাবে অরিয়েন্টেশন বের করার জন্য অ্যাক্সিলোমিটার বা মাধ্যাকর্ষণ সেন্সর ব্যবহার করবেন।
আপনি যদি কিছু ডিভাইসে getRes Source ()। GetConfigration () ব্যবহার করেন তবে এটি ভুল পাবেন। প্রাথমিকভাবে আমরা http://apphan.com.com এ ব্যবহার করেছি । অ্যাফেন্সের দূরবর্তী লগিংয়ের জন্য আমরা এটি বিভিন্ন ডিভাইসে দেখতে পেলাম এবং আমরা দেখেছি যে খণ্ডগুলি এখানে তার ভূমিকা পালন করে। আমি অদ্ভুত মামলাগুলি দেখেছি: উদাহরণস্বরূপ, এইচটিসি ডিজায়ার এইচডিতে বিকল্প পোর্ট্রেট এবং স্কোয়ার (?!):
CONDITION[17:37:10.345] screen: rotation: 270 orientation: square
CONDITION[17:37:12.774] screen: rotation: 0 orientation: portrait
CONDITION[17:37:15.898] screen: rotation: 90
CONDITION[17:37:21.451] screen: rotation: 0
CONDITION[17:38:42.120] screen: rotation: 270 orientation: square
বা মোটেও ওরিয়েন্টেশন পরিবর্তন করা যায় না:
CONDITION[11:34:41.134] screen: rotation: 0
CONDITION[11:35:04.533] screen: rotation: 90
CONDITION[11:35:06.312] screen: rotation: 0
CONDITION[11:35:07.938] screen: rotation: 90
CONDITION[11:35:09.336] screen: rotation: 0
অন্যদিকে, প্রস্থ () এবং উচ্চতা () সর্বদা সঠিক (এটি উইন্ডো ম্যানেজার দ্বারা ব্যবহৃত হয়, তাই এটি আরও ভাল হওয়া উচিত)। আমি বলব যে সবসময় প্রস্থ / উচ্চতা যাচাই করা ভাল ধারণা। যদি আপনি একটি মুহুর্ত সম্পর্কে চিন্তা করেন তবে এটি হ'ল আপনি যা চান - প্রস্থটি উচ্চতা (প্রতিকৃতি), বিপরীত (ল্যান্ডস্কেপ) এর চেয়ে ছোট কিনা তা জানতে বা সেগুলি সমান (বর্গক্ষেত্র) হয়।
তারপরে এটি এই সাধারণ কোডটিতে নেমে আসে:
public int getScreenOrientation()
{
Display getOrient = getWindowManager().getDefaultDisplay();
int orientation = Configuration.ORIENTATION_UNDEFINED;
if(getOrient.getWidth()==getOrient.getHeight()){
orientation = Configuration.ORIENTATION_SQUARE;
} else{
if(getOrient.getWidth() < getOrient.getHeight()){
orientation = Configuration.ORIENTATION_PORTRAIT;
}else {
orientation = Configuration.ORIENTATION_LANDSCAPE;
}
}
return orientation;
}
getWidth
এবং getHeight
হ্রাস করা হয় না।
getSize(Point outSize)
পরিবর্তে ব্যবহার করুন। আমি এপিআই 23 ব্যবহার করছি
এই সমস্যাটি সমাধানের আর একটি উপায় হ'ল প্রদর্শন থেকে সঠিক রিটার্ন মানের উপর নির্ভর না করে সমাধান করা অ্যান্ড্রয়েড সংস্থানসমূহের উপর নির্ভর করা।
layouts.xml
ফোল্ডারগুলিতে res/values-land
এবং res/values-port
নিম্নলিখিত সামগ্রী সহ ফাইলটি তৈরি করুন :
মাঝামাঝি / মান জমি / layouts.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="is_landscape">true</bool>
</resources>
মাঝামাঝি / মান-পোর্ট / layouts.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="is_landscape">false</bool>
</resources>
আপনার উত্স কোডে আপনি এখন নিম্নোক্তভাবে বর্তমান ওরিয়েন্টেশনটি অ্যাক্সেস করতে পারবেন:
context.getResources().getBoolean(R.bool.is_landscape)
ফোনের বর্তমান ওরিয়েন্টেশন নির্দিষ্ট করার একটি সম্পূর্ণ উপায়:
public String getRotation(Context context){
final int rotation = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getOrientation();
switch (rotation) {
case Surface.ROTATION_0:
return "portrait";
case Surface.ROTATION_90:
return "landscape";
case Surface.ROTATION_180:
return "reverse portrait";
default:
return "reverse landscape";
}
}
চিয়ার বিনহ্ এনগুইন
getOrientation()
কাজ করে তা মনে নেই , তবে এটি ব্যবহার করা সঠিক নয় getRotation()
। ঘূর্ণন "Returns the rotation of the screen from its "natural" orientation."
উত্স পান । সুতরাং কোনও ফোনে ROTATION_0 বলা প্রতিকৃতি সম্ভবত সঠিক, তবে একটি ট্যাবলেটে এটির "প্রাকৃতিক" অবস্থান সম্ভবত ল্যান্ডস্কেপ এবং ROTATION_0 এর প্রতিকৃতির পরিবর্তে ল্যান্ডস্কেপ ফিরে আসা উচিত।
এখানে কোড স্নিপেট ডেমো কীভাবে স্ক্রিন ওরিয়েন্টেশন পাবেন তা হ্যাকবড এবং মার্টিজন দ্বারা প্রস্তাবিত হয়েছিল :
Ri ওরিয়েন্টেশন পরিবর্তনের সময় ট্রিগার:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
int nCurrentOrientation = _getScreenOrientation();
_doSomeThingWhenChangeOrientation(nCurrentOrientation);
}
Hack হ্যাকবোড সুপারিশ হিসাবে বর্তমান ওরিয়েন্টেশন পান :
private int _getScreenOrientation(){
return getResources().getConfiguration().orientation;
}
বর্তমান স্ক্রিন ওরিয়েন্টেশন পেতে বিকল্প সমাধান রয়েছে Mar মার্টিজন সমাধান অনুসরণ করুন :
private int _getScreenOrientation(){
Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
return display.getOrientation();
}
★ দ্রষ্টব্য : আমি implement & both উভয়ই প্রয়োগ করার চেষ্টা করছিলাম, কিন্তু রিয়েলডেভাইস (NexusOne SDK 2.3) ওরিয়েন্টেশনটিতে এটি ভুল দিকনির্দেশকে ফিরিয়ে দেয়।
★ সুতরাং আমি ব্যবহৃত সমাধানের পরামর্শ দিই দিচ্ছি Screen স্ক্রিন ওরিয়েন্টেশন পেতে যাতে আরও বেশি সুবিধা রয়েছে: স্পষ্টভাবে, সহজ এবং কবজির মতো কাজ করুন।
Expected আমাদের প্রত্যাশিত হিসাবে সঠিক তা নিশ্চিত করতে মনোযোগের ফেরত সতর্কতার সাথে চেক করুন (শারীরিক ডিভাইসগুলির নির্দিষ্টকরণের উপর সীমিত নির্ভরশীলতা থাকতে পারে)
আশা করি এটি সাহায্য করবে,
int ot = getResources().getConfiguration().orientation;
switch(ot)
{
case Configuration.ORIENTATION_LANDSCAPE:
Log.d("my orient" ,"ORIENTATION_LANDSCAPE");
break;
case Configuration.ORIENTATION_PORTRAIT:
Log.d("my orient" ,"ORIENTATION_PORTRAIT");
break;
case Configuration.ORIENTATION_SQUARE:
Log.d("my orient" ,"ORIENTATION_SQUARE");
break;
case Configuration.ORIENTATION_UNDEFINED:
Log.d("my orient" ,"ORIENTATION_UNDEFINED");
break;
default:
Log.d("my orient", "default val");
break;
}
ব্যবহার getResources().getConfiguration().orientation
এটি সঠিক উপায়ে ।
আপনাকে কেবলমাত্র বিভিন্ন ধরণের ল্যান্ডস্কেপ, ডিভাইসটি সাধারণত ব্যবহার করে এমন ল্যান্ডস্কেপ এবং অন্যটি সন্ধান করতে হবে।
কীভাবে এটি পরিচালনা করবেন তা এখনও বুঝতে পারছেন না।
এর বেশিরভাগ উত্তর পোস্ট হওয়ার পরে কিছু সময় অতিবাহিত হয়েছে এবং কিছু এখন অবহিত পদ্ধতি এবং ধ্রুবক ব্যবহার করে।
এই পদ্ধতিগুলি এবং ধ্রুবকগুলি আর ব্যবহার না করার জন্য আমি জারেকের কোড আপডেট করেছি :
protected int getScreenOrientation()
{
Display getOrient = getWindowManager().getDefaultDisplay();
Point size = new Point();
getOrient.getSize(size);
int orientation;
if (size.x < size.y)
{
orientation = Configuration.ORIENTATION_PORTRAIT;
}
else
{
orientation = Configuration.ORIENTATION_LANDSCAPE;
}
return orientation;
}
নোট করুন যে মোডটি Configuration.ORIENTATION_SQUARE
আর সমর্থিত নয়।
ব্যবহারের পরামর্শের পদ্ধতির বিপরীতে আমি এটি পরীক্ষা করেছি এমন সমস্ত ডিভাইসে এটি নির্ভরযোগ্য বলে মনে হয়েছিল getResources().getConfiguration().orientation
রানটাইমে স্ক্রিন ওরিয়েন্টেশন পরীক্ষা করুন।
@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();
}
}
এটি করার আরও একটি উপায় রয়েছে:
public int getOrientation()
{
if(getResources().getDisplayMetrics().widthPixels>getResources().getDisplayMetrics().heightPixels)
{
Toast t = Toast.makeText(this,"LANDSCAPE",Toast.LENGTH_SHORT);
t.show();
return 1;
}
else
{
Toast t = Toast.makeText(this,"PORTRAIT",Toast.LENGTH_SHORT);
t.show();
return 2;
}
}
অ্যান্ড্রয়েড এসডিকে আপনাকে এটি ঠিক সূক্ষ্মভাবে বলতে পারে:
getResources().getConfiguration().orientation
2019 এআইপি 28-তে পরীক্ষা করা হয়েছে, ব্যবহারকারী প্রতিকৃতি ওরিয়েন্টেশন নির্ধারণ করেছেন বা না করেই এবং অন্যের তুলনায় ন্যূনতম কোড সহ , পুরানো উত্তর , নিম্নলিখিতটি সঠিক দিকনির্দেশটি সরবরাহ করে:
/** @return The {@link Configuration#ORIENTATION_SQUARE}, {@link Configuration#ORIENTATION_PORTRAIT}, {@link Configuration#ORIENTATION_LANDSCAPE} constants based on the current phone screen pixel relations. */
private int getScreenOrientation()
{
DisplayMetrics dm = context.getResources().getDisplayMetrics(); // Screen rotation effected
if(dm.widthPixels == dm.heightPixels)
return Configuration.ORIENTATION_SQUARE;
else
return dm.widthPixels < dm.heightPixels ? Configuration.ORIENTATION_PORTRAIT : Configuration.ORIENTATION_LANDSCAPE;
}
ওরিয়েন্টেশন পরিবর্তন কার্যকর হওয়ার পরে এই কোডটি কাজ করতে পারে বলে আমি মনে করি
Display getOrient = getWindowManager().getDefaultDisplay();
int orientation = getOrient.getOrientation();
অ্যাক্টিভিটি.অনসিফিজারেশন চেনজড (কনফিগারেশন নিউকনফিগ) ফাংশন ও সেট করুন কনটেন্টভিউ কল করার আগে নতুন ওরিয়েন্টেশন সম্পর্কে বিজ্ঞপ্তি পেতে চাইলে নতুন কনফিগ, ওরিয়েন্টেশন ব্যবহার করুন।
আমি মনে করি getRotationv () ব্যবহার করা কোনও উপকারে আসেনি কারণ http://developer.android.com/references/android/view/Display.html#getRotation% ২৯৯৯৯ getRotation () স্ক্রিনের ঘূর্ণনটিকে তার "প্রাকৃতিক" থেকে ফিরিয়ে দেয় অভিযোজন।
সুতরাং আপনি যদি না "প্রাকৃতিক" দৃষ্টিভঙ্গি জানেন না তবে আবর্তন অর্থহীন।
আমি একটি সহজ উপায় খুঁজে পেয়েছি,
Display display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;
if(width>height)
// its landscape
এই কারও সাথে সমস্যা আছে কিনা আমাকে বলুন?
এটি অন্যাপল 3 এর মতো সমস্ত ফোনকে ওভারলে করে
public static boolean isScreenOriatationPortrait(Context context) {
return context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT;
}
সঠিক কোডটি নিম্নরূপ:
public static int getRotation(Context context){
final int rotation = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getOrientation();
if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180){
return Configuration.ORIENTATION_PORTRAIT;
}
if(rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270){
return Configuration.ORIENTATION_LANDSCAPE;
}
return -1;
}
পুরানো পোস্ট আমি জানি। ওরিয়েন্টেশন যা-ই হোক না কেন বা অদলবদল হওয়া ইত্যাদি 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); }
}
একটি যাদুমন্ত্র মত কাজ করে!
এইভাবে ব্যবহার করুন,
int orientation = getResources().getConfiguration().orientation;
String Orintaion = "";
switch (orientation)
{
case Configuration.ORIENTATION_UNDEFINED: Orintaion = "Undefined"; break;
case Configuration.ORIENTATION_LANDSCAPE: Orintaion = "Landscrape"; break;
case Configuration.ORIENTATION_PORTRAIT: Orintaion = "Portrait"; break;
default: Orintaion = "Square";break;
}
স্ট্রিং-এ আপনার ওরিশন রয়েছে
এটি করার অনেক উপায় আছে, এই কোডের টুকরোটি আমার পক্ষে কাজ করে
if (this.getWindow().getWindowManager().getDefaultDisplay()
.getOrientation() == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
// portrait mode
} else if (this.getWindow().getWindowManager().getDefaultDisplay()
.getOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
// landscape
}
আমি মনে করি এই সমাধানটি সহজ
if (context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT){
user_todat_latout = true;
} else {
user_todat_latout = false;
}
কেবল সহজ দুটি লাইন কোড
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
// do something in landscape
} else {
//do in potrait
}
সহজ এবং সহজ :)
জাভা ফাইলে লিখুন:
private int intOrientation;
এ onCreate
পদ্ধতি আগে setContentView
লেখ:
intOrientation = getResources().getConfiguration().orientation;
if (intOrientation == Configuration.ORIENTATION_PORTRAIT)
setContentView(R.layout.activity_main);
else
setContentView(R.layout.layout_land); // I tested it and it works fine.
এটাও লক্ষণীয় যে আজকাল, getResources().getConfiguration().orientation
আপনি যদি লেআউট কারণে এমনটি করেন তবে সুস্পষ্ট দিকনির্দেশনা পরীক্ষা করার কম কারণ আছে , যেমন অ্যান্ড্রয়েড / / এপিআই ২৪++ এ প্রবর্তিত মাল্টি-উইন্ডো সমর্থন আপনার লেআউটগুলির সাথে কিছুটা গোলমাল করতে পারে অভিযোজন। উন্নত ব্যবহারের বিষয়ে বিবেচনা করার জন্য <ConstraintLayout>
, এবং বিকল্প লেআউট প্রাপ্তিসাধ্য প্রস্থ বা উচ্চতা উপর নির্ভরশীল বা নির্ধারণের যা লেআউট ব্যবহার করা হচ্ছে, যেমন উপস্থিতি অন্য ঠাট সহ, নির্দিষ্ট টুকরা আপনার কার্যকলাপ সংযুক্ত করা হচ্ছে।
আপনি এটি ব্যবহার করতে পারেন ( এখানে ভিত্তি করে ):
public static boolean isPortrait(Activity activity) {
final int currentOrientation = getCurrentOrientation(activity);
return currentOrientation == ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT || currentOrientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
}
public static int getCurrentOrientation(Activity activity) {
//code based on https://www.captechconsulting.com/blog/eric-miles/programmatically-locking-android-screen-orientation
final Display display = activity.getWindowManager().getDefaultDisplay();
final int rotation = display.getRotation();
final Point size = new Point();
display.getSize(size);
int result;
if (rotation == Surface.ROTATION_0
|| rotation == Surface.ROTATION_180) {
// if rotation is 0 or 180 and width is greater than height, we have
// a tablet
if (size.x > size.y) {
if (rotation == Surface.ROTATION_0) {
result = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
} else {
result = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
}
} else {
// we have a phone
if (rotation == Surface.ROTATION_0) {
result = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
} else {
result = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
}
}
} else {
// if rotation is 90 or 270 and width is greater than height, we
// have a phone
if (size.x > size.y) {
if (rotation == Surface.ROTATION_90) {
result = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
} else {
result = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
}
} else {
// we have a tablet
if (rotation == Surface.ROTATION_90) {
result = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
} else {
result = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
}
}
}
return result;
}