অ্যান্ড্রয়েড: ট্যাবলেটগুলির জন্য প্রতিকৃতি এবং ল্যান্ডস্কেপকে অনুমতি দেবেন, তবে ফোনে পোর্ট্রেট জোর করবেন?


191

আমি চাই ট্যাবলেটগুলি প্রতিকৃতি এবং ল্যান্ডস্কেপ (sw600dp বা তার চেয়েও বেশি) প্রদর্শন করতে সক্ষম হোক, তবে ফোনগুলি কেবল প্রতিকৃতিতে সীমাবদ্ধ রাখে। শর্তসাপেক্ষে ওরিয়েন্টেশন বেছে নেওয়ার কোনও উপায় আমি খুঁজে পাচ্ছি না। কোনও পরামর্শ?


একটি উপায় হ'ল ফোনের জন্য ল্যান্ডস্কেপ বিন্যাসগুলি ডিজাইন না করা, যেমন layout-landঅভ্যন্তর resফোল্ডারটি ব্যবহার করে ।
ভুত

12
এটি কেবল পোর্ট্রেট লেআউটকে আড়াআড়ি দেখানোর কারণ হতে পারে। এটি কোনও ফোনকে আড়াআড়ি থেকে আবর্তিত হতে আটকাবে না।
র‌্যাডলি

উত্তর:


446

সংস্থান এবং আকারের বাছাইকারীদের ব্যবহারের জন্য এখানে একটি ভাল উপায় ।

এই বুল রিসোর্সটিকে পুনরায় / মানগুলিতে 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 ডিভাইসগুলিতে এক্স-বৃহত ডিভাইসগুলি (ট্যাবলেটগুলি মূলত) সেন্সর এবং ব্যবহারকারী-লক ঘূর্ণন ইত্যাদির উপর নির্ভর করে স্বাভাবিকের মতো আচরণ করবে । বাকি সমস্ত কিছু (ফোন, বেশ কিছু) কেবল প্রতিকৃতি হবে।


1
আমার কি xlargeখুব বেশি ব্যবহার করা দরকার বা আমি কেবল ব্যবহার করতে পারি sw600dp? এই দিনগুলিতে সম্ভবত কোনও ট্যাবলেট চলছে << 3.2।
theblang

7
ঠিক আছে, ল্যান্ডস্কেপ শুরু হওয়ার সাথে সাথে এই সম্ভাব্য ক্রিয়াকলাপটি পুনরায় চালু করে, দেখুন ডেভেলপার
.অ্যান্ড্রয়েড

1
@ বনডাক্স এই মন্তব্যটি কেবলমাত্র প্রয়োগ করে "যদি ক্রিয়াকলাপটি বর্তমানে অগ্রভাগে থাকে বা অন্যথায় স্ক্রিন ওরিয়েন্টেশনকে প্রভাবিত করে" যা এই মুহুর্তে আমরা অনক্রিট হওয়ার পরে এমনটি হতে পারে না।
ব্রায়ান ক্রিস্টেনসেন

1
@ ব্রায়ান ক্রিসটেনসেন আমি অনুরোধ করা ওরিয়েন্টেশনটি সেট করার সময় একটি ক্রিয়াকলাপ পুনরায় আর্ট করা লক্ষ্য করেছি onCreate()। আমি যখন কলটি সরিয়ে নিয়েছিsetRequestedOrientation() সময় এবং প্রসঙ্গে আলাদা অবস্থানে নিয়ে গিয়েছিলাম তখন পুনরায় আরম্ভ আর কিছু হয় নি।
বন্ডাক্স

8
যদি আমি ল্যান্ডস্কেপ মোডে অ্যাপটি শুরু করি তবে এটি একটি সংক্ষিপ্ত মুহুর্তের জন্য ল্যান্ডস্কেপ মোডটি দেখায়।
最白目

29

আপনি প্রথমে ডিভাইসের স্ক্রিন আকার পেতে এই পদ্ধতিতে চেষ্টা করতে পারেন

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);

4
আমাকে কী পদ্ধতিতে সেটরেক্টেড ওরিয়েন্টেশন () পদ্ধতি স্থাপন করা উচিত? একবার অনক্রিয়েট শুরু হয়ে গেলে, এটি ইতিমধ্যে এটি পছন্দ করতে পারে তা বেছে নিয়েছে।
কেনি ওয়াইল্যান্ড

কেনি এটি পরীক্ষা করে দেখুন আমি মনে করি এটি আপনাকে স্ট্যাকওভারফ্লো
অবি কুমার মানকু

আমি দেখছি যে এই উত্তরটি অগ্রাহ্য হয়েছিল, তবে আমি নিশ্চিত নই যে এটি সমস্যার সমাধান করে। Configurationউপলব্ধ screenLayoutতথ্য - ডিপিআই। প্রশ্নটি শারীরিক ডিভাইসের স্ক্রিন আকারের সাথে সম্পর্কিত - ফোন ভিএস ট্যাবলেট। অর্থ, আপনার একটি Configuration.SCREENLAYOUT_SIZE_NORMALথাকতে পারে এবং এটি এমডিপিআই ট্যাবলেট হতে পারে।
নাইটফিক্সড

আমি ইস্যুটির মুখোমুখি স্ট্যাকওভারফ্লো.com
আদিত্য ব্যাস-লখন

10

গৃহীত উত্তরের পরিপূরক

আপনি অ্যান্ড্রয়েড স্টুডিওতে নিম্নলিখিত ফাইলগুলি তাদের ফাইলগুলি res/values-sw600dpএবং res/values-largeডিরেক্টরিগুলি যুক্ত করতে পারেন canbools.xml

মান-sw600dp

প্রথমত, প্রকল্প ট্যাব থেকে নেভিগেটরে প্রকল্প (অ্যান্ড্রয়েডের চেয়ে) ফিল্টারটি নির্বাচন করুন।

এখানে চিত্র বর্ণনা লিখুন

তারপরে 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ফাইলটি তৈরি করতে আগের মতো ডিরেক্টরিতে ডান ক্লিক করুন।


2
এটি কাজ না করে থাকলে আমাকে জানান এবং আমি এটি ঠিক করে দেব। এটা আমার জন্য কাজ করেছে। আমি একটি ডাউনওয়েট পেয়েছি তবে কোনও মন্তব্য নেই তাই কী ঠিক করতে হবে তা আমি জানি না।
সুরগচ

9

আমি এটি কীভাবে করেছি তা এখানে রয়েছে ( 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 আমি ধরে নিয়েছি উত্তরটি উপরের লিঙ্কটি যা কিছু করে তার অনুরূপ কিছু করছে তবে আমি এটি আমার পক্ষে কাজ করতে পারি না - এটি আমার সমস্ত ডেটা মুছে ফেলে। তবে আপনার যদি প্রতিকৃতি এবং ল্যান্ডস্কেপের জন্য একই লেআউট ফাইল রয়েছে এমন একটি সাধারণ পর্যাপ্ত অ্যাপ রয়েছে তবে এটি কাজ করা উচিত।


2
আপনার লেআউট-ল্যান্ড ফোল্ডারে ল্যান্ডস্কেপ লেআউটগুলি
রাখুন

আপনি সুপার অন
কনফিগারেশনের

8

জিনির উত্তর অনুসরণ করা , আমি মনে করি এটি করার সবচেয়ে নির্ভরযোগ্য উপায়টি নিম্নরূপ:

এখানে বর্ণিত হিসাবে , উত্সগুলিতে একটি বুলিয়ান রাখুন 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>

5

ঠিক আছে, এটি বেশ খানিকটা দেরি হলেও, এখানে একটি এক্সএমএল-কেবল তবে একটি হ্যাক সমাধান যা কোনও ক্রিয়াকলাপটিকে পুনরায় তৈরি করে নাsetRequestedOrientation ওরিয়েন্টেশন পরিবর্তন করতে হবে:

https://stackoverflow.com/a/27015879/1281930


1
কাজ করে না, ট্যাবলেটগুলি সর্বদা ফোনের ওরিয়েন্টেশন নেয়। দৃশ্যত অ্যান্ড্রয়েড: স্ক্রিন ওরিয়েন্টেশন কোনও রিসোর্স মডিফায়ার প্রয়োগ করার আগে ম্যানিফেস্টে সমস্ত ক্রিয়াকলাপের জন্য ঠিক একবার সেট করা হয়।
0101100101

2

অনুসরণ গৃহীত উত্তর, আমি সমাধান আশা নিয়ে 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)
    }
}

1

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

উদাহরণ:

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);

0

পুরানো প্রশ্ন আমি জানি। আপনার অ্যাপ্লিকেশন সর্বদা পোর্ট্রেট মোডে চালানোর জন্য এমনকি অভিমুখীকরণ ইত্যাদি হতে পারে বা অদলবদল করা যেতে পারে ইত্যাদি (উদাহরণস্বরূপ, ট্যাবলেটগুলিতে) আমি এই ফাংশনটি ডিজাইন করেছি যা প্রতিকৃতি এবং ল্যান্ডস্কেপ কীভাবে তা প্রয়োজন ছাড়াই ডান দিকনির্দেশে ডিভাইসটি সেট করতে ব্যবহৃত হয় বৈশিষ্ট্যগুলি ডিভাইসে সংগঠিত হয়।

   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ক্রিয়ায় যুক্ত করুন এবং সরান ;-)

আপনি যদি বিপরীতটি করতে চান তবে আপনার কোডটি অবশ্যই ল্যান্ডস্কেপে পরিবর্তন করতে হবে (তবে আমি মনে করি এটি কীভাবে এটি পরিষ্কার)।


0

দুর্ভাগ্যক্রমে, পদ্ধতি সেটরেক্টেড ওরিয়েন্টেশন (...) ব্যবহার করে ফলে ক্রিয়াকলাপটি পুনরায় আরম্ভ হবে, সুতরাং আপনি যদি এটি অনক্রিট পদ্ধতিতে কল করেন তবে এটি ক্রিয়াকলাপের জীবনচক্রের মধ্য দিয়ে যাবে এবং তারপরে অনুরোধের ভিত্তিতে একই ক্রিয়াকলাপটি পুনরায় তৈরি করবে। সুতরাং @ ব্রায়ান ক্রিস্টেনসেনের উত্তরে আপনার বিবেচনা করা উচিত যে ক্রিয়াকলাপটি কোডটি দু'বার কল করা যেতে পারে, এর খারাপ প্রভাব থাকতে পারে (কেবল ভিজ্যুয়াল নয়, নেটওয়ার্ক অনুরোধ, বিশ্লেষণ ইত্যাদি))

তদ্ব্যতীত, ম্যানিফেস্টে কনফিগার চেঞ্জের বৈশিষ্ট্যটি সেট করা আমার মতে একটি বড় বাণিজ্য-বন্ধ, যা প্রচুর রিফ্যাক্টরিং ব্যয় নিতে পারে। অ্যান্ড্রয়েড ডিভস সেই বৈশিষ্ট্যটি পরিবর্তন করার পরামর্শ দিচ্ছে না

শেষ অবধি, স্ক্রিন ওরিয়েন্টেশনটি কিছুটা আলাদা করার চেষ্টা করা হয়েছে (পুনরায় আরম্ভের সমস্যা এড়াতে) অসম্ভব, স্থির ম্যানিফেস্টের কারণে স্থায়ীভাবে অসম্ভব যা পরিবর্তন করা যায় না, প্রোগ্রামিকভাবে ইতিমধ্যে শুরু হওয়া ক্রিয়াকলাপে কেবল সেই পদ্ধতিটি কল করা সম্ভব।

সংক্ষিপ্তসার: আমার মতে @ ব্রায়ান ক্রিস্টেনসেন পরামর্শটি সেরা বাণিজ্য বন্ধ, তবে পুনরায় আরম্ভ করার ক্রিয়াকলাপের বিষয়ে সচেতন হন।

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