রানটাইমের সময় কীভাবে লক করবেন


107

রানটাইমের সময় ওরিয়েন্টেশন লক করার কোনও উপায় আছে কি? উদাহরণস্বরূপ, আমি যদি ব্যবহারকারী বর্তমানে ল্যান্ডস্কেপটিতে রয়েছেন এবং মেনু বিকল্পটি টগল করেন তবে ব্যবহারকারীকে পর্দা ল্যান্ডস্কেপে লক করার অনুমতি দিতে চাই।

উত্তর:


133
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

কোনও ক্রিয়াকলাপে কল করা, এটিকে ল্যান্ডস্কেপে লক করে দেবে। ক্রিয়াকলাপ তথ্য ক্লাসে অন্যান্য পতাকা সন্ধান করুন। আপনি এটি প্রতিকৃতিতে আবার লক করতে পারেন বা এটি সেন্সর / স্লাইডার চালিত করতে পারেন।

এখানে আরও তথ্য: http://www.devx.com/wireless/Article/40792


13
ঠিক আছে ধন্যবাদ. এটি দুর্দান্ত কাজ করে। এটি বর্তমান ওরিয়েন্টেশন পাবে। getResource ()। getConfigration ()। orientation
জেরেড

7
সাবধান হন! কী কনফিগারেশন () ফেরত দেয় এবং কী সেট-রিকুয়েস্টড ওরিয়েন্টেশন চায় তার মধ্যে আপনাকে আলাদা করতে হবে - বিশদটির জন্য আমার উত্তরটি নীচে দেখুন
অ্যান্ডি ওয়েইনস্টেইন

এই পদ্ধতির সাথে একটি সমস্যা আছে। আপনি এই উত্তরের
দেখেছেন

তবে এটি সমস্ত ক্রিয়াকলাপের জন্য একই অরিয়েন্টেশনটি সেট করে, এমন কোনও উপায় আছে যেখানে আমরা অভিমুখ পরিবর্তন করতে পারি
রূপালীফক্সএ

106

GetConfigration কী দেয় এবং কী কী সেটরেক্টেড ওরিয়েন্টেশন চায় তার মধ্যে পার্থক্য সম্পর্কে সতর্ক থাকুন - তারা উভয়ই অন্তর্নিহিত, তবে তারা বিভিন্ন ধ্রুবক সংজ্ঞা থেকে আসছে।

180 ডিগ্রি ফ্লিপগুলি দেওয়ার সময় কীভাবে বর্তমান ওরিয়েন্টেশনটি লক করা যায় তা এখানে

int currentOrientation = getResources().getConfiguration().orientation;
if (currentOrientation == Configuration.ORIENTATION_LANDSCAPE) {
   setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
}
else {
   setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
}

13
আপনি যদি SCREEN_ORIENTATION_USER_landSCAPE ব্যবহার করতে পছন্দ করতে পারেন কারণ ব্যবহারকারী যদি সেটিংসে স্ক্রিন রোটেশন অক্ষম করে থাকে তবে এটি 180 ডিগ্রি ফ্লপ করতে দেয় না। তেমনি ফ্রি রোটেশনে ফিরে যাওয়ার সময়, SCREEN_ORIENTATION_USER SCREEN_ORIENTATION_SENSOR এর চেয়ে ভাল কারণ পরের সেটিংসটি না বললেও নিখরচায় আবর্তনের অনুমতি দেয়।
স্টিভ ওয়ারিং 12

উজ্জ্বল! এটি যুক্ত করা দরকার যখন আপনি বিপরীত ওরিয়েন্টেশন পুনরায় কনফিগারেশন স্যুইচ করেন না। কমপক্ষে ডিভাইসে আমি এটি পরীক্ষা করেছি tested কিছু ডায়ালগ শো ইত্যাদির সময় আপনি পুনরায় কনফিগারেশন বন্ধ করতে চান কিনা তা জানা সত্যিই গুরুত্বপূর্ণ
sberezin

47

এটি বিপরীত প্রতিকৃতি এবং বিপরীত ল্যান্ডস্কেপযুক্ত ডিভাইসগুলিতে কাজ করে।

লক ওরিয়েন্টেশন:

    int orientation = getActivity().getRequestedOrientation();
    int rotation = ((WindowManager) getActivity().getSystemService(
            Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation();
    switch (rotation) {
    case Surface.ROTATION_0:
        orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
        break;
    case Surface.ROTATION_90:
        orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
        break;
    case Surface.ROTATION_180:
        orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
        break;
    default:
        orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
        break;
    }

    getActivity().setRequestedOrientation(orientation);

আনলক নির্দেশনা:

   getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);

5
ঘূর্ণন "Returns the rotation of the screen from its "natural" orientation." উত্স পান । সুতরাং কোনও ফোনে ROTATION_0 বলতে প্রতিকৃতি সম্ভবত সঠিক, তবে একটি ট্যাবলেটে এটির "প্রাকৃতিক" অভিভাবন সম্ভবত ল্যান্ডস্কেপ এবং ROTATION_0 এর প্রতিকৃতির পরিবর্তে ল্যান্ডস্কেপ ফিরে আসা উচিত।
jp36

@ jp36, আমি একটি নেক্সাস 7 এ পরীক্ষা করেছি যা একটি প্রাকৃতিক অভিমুখ যা ফোনের মতো। একটি বড় ট্যাবলেট পরীক্ষার জন্য ধন্যবাদ (যা আমার কাছে নেই)।
pstoppani

1
জেপি ৩6-তে যেমন বলা হয়েছে, এটি প্রাকৃতিক প্রাকৃতিক দৃশ্যের সাথে ট্যাবলেটগুলিতে কাজ করে না!
ডোমিনিকএম

আমরা ডিভাইসে কীভাবে বিপরীত প্রতিকৃতি পরীক্ষা করব ??
অ্যান্ডবয়

27

আমারও মনে হচ্ছিল একই রকম ঘটনা ঘটেছে। আমি যে কোনও ওরিয়েন্টেশনকে সমর্থন করতে চেয়েছিলাম, তবে ওয়ার্কফ্লোতে একটি নির্দিষ্ট পয়েন্টের পরে আমার বর্তমান ওরিয়েন্টেশনটিতে থাকা দরকার। আমার সমাধানটি ছিল:

সুরক্ষিত কর্মপ্রবাহের প্রবেশের সময়:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);

সুরক্ষিত ওয়ার্কফ্লো প্রস্থান করার সময়:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);

2
কমপক্ষে অ্যান্ড্রয়েড> = 16 এ এটি ওকিউকে সম্বোধন করে না set
গ্রেগ 7gkb

3
আমার কাছে, এটি নাকসনারে সেট করা আমাকে প্রতিকৃতি মোডে ফিরিয়ে নিয়ে যায় যদি আমি ল্যান্ডস্কেপে থাকি আমি পরিবর্তে SCREEN_ORIENTATION_LLKED ব্যবহার করি এবং এটি আমার পক্ষে কাজ করে
জিম্মার 31:48

1
@ জিএমএমআরসিসিআরএন_আরআইএনটিএইচ_লোকড অ্যান্ড্রয়েড> = 18 এর জন্য সেরা উপায় But তবে আপনি যদি কিছু কম লক্ষ্য করে থাকেন তবে তা কার্যকর হয় না। আমি নীচে j.in6 এর উত্তরটি ব্যবহার করার পরামর্শ দিচ্ছি।
প্যাট্রিক বুস

23

ট্যাবলেটগুলির সমর্থন সহ @pstoppani জবাবের বিকল্প (@pstoppani উত্তর হিসাবে, এটি কেবলমাত্র ডিভাইসগুলিতে কাজ করবে> ২.২) -
পরীক্ষিত Samsung Galaxy SIIIএবংSamsung Galaxy Tab 10.1

public static void lockOrientation(Activity activity) {
    Display display = ((WindowManager) activity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
    int rotation = display.getRotation();
    int tempOrientation = activity.getResources().getConfiguration().orientation;
    int orientation = 0;
    switch(tempOrientation)
    {
    case Configuration.ORIENTATION_LANDSCAPE:
        if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90)
            orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
        else
            orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
        break;
    case Configuration.ORIENTATION_PORTRAIT:
        if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_270)
            orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
        else
            orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
    }
    activity.setRequestedOrientation(orientation);
}

ধন্যবাদ, এটা জরিমানা কাজ করছে কিন্তু আমি বুঝতে পারে না যে কেন এটা দিয়ে চেক ||মধ্যে rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90এবং সঙ্গে rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_270। সুতরাং আমার 2 সন্দেহ আছে :::: প্রথম, দ্বিতীয় ক্ষেত্রে ROTATION_0পরিবর্তে কেন ROTATION_180অন্য একটি কেন 180 ডিগ্রি 90 না দিয়ে 0 ডিগ্রি পরীক্ষা করবেন?
অ্যান্ডবয়

@ অ্যান্ডবয় এটি ডিভাইসের ডিফল্ট অভিযোজন সাথে করতে হবে। সাধারণত ফোনের প্রতিকৃতিটির ডিফল্ট ওরিয়েন্টেশন থাকে যার অর্থ পোট্রেটের জন্য ঘূর্ণন শূন্য হয়, তবে কিছু ট্যাবলেটে একটি ল্যান্ডস্কেপের ডিফল্ট থাকে যার অর্থ ঘূর্ণন আড়াআড়িভাবে শূন্য ফিরে আসে returns সুতরাং বিভিন্ন ||চেক ডিভাইস রিপোর্টিং ল্যান্ডস্কেপ বনাম প্রতিকৃতির ভিত্তিতে সম্ভাব্য দুটি ডিফল্ট ওরিয়েন্টেশন পরিচালনা করছে।
j.in6

5

এখানে আমার কোড, আপনি এই স্ক্রিনগুলির একটিতে আপনার স্ক্রিনটি লক করতে পারেন এবং একবার কাজটি আনলক ওরিয়েন্টেশন দিয়ে আনলক করে শেষ করতে পারেন:

/** Static methods related to device orientation. */
public class OrientationUtils {
    private OrientationUtils() {}

    /** Locks the device window in landscape mode. */
    public static void lockOrientationLandscape(Activity activity) {
        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    }

    /** Locks the device window in portrait mode. */
    public static void lockOrientationPortrait(Activity activity) {
    activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }

    /** Locks the device window in actual screen mode. */
    public static void lockOrientation(Activity activity) {
        final int orientation = activity.getResources().getConfiguration().orientation;
        final int rotation = ((WindowManager) activity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation();

        // Copied from Android docs, since we don't have these values in Froyo 2.2
        int SCREEN_ORIENTATION_REVERSE_LANDSCAPE = 8;
        int SCREEN_ORIENTATION_REVERSE_PORTRAIT = 9;

        // Build.VERSION.SDK_INT <= Build.VERSION_CODES.FROYO
        if (!BuildVersionUtils.hasGingerbread()) {
            SCREEN_ORIENTATION_REVERSE_LANDSCAPE = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
            SCREEN_ORIENTATION_REVERSE_PORTRAIT = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
        }

        if (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90){
            if (orientation == Configuration.ORIENTATION_PORTRAIT){
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            }
            else if (orientation == Configuration.ORIENTATION_LANDSCAPE){
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            }
        }
        else if (rotation == Surface.ROTATION_180 || rotation == Surface.ROTATION_270) 
        {
            if (orientation == Configuration.ORIENTATION_PORTRAIT){
                activity.setRequestedOrientation(SCREEN_ORIENTATION_REVERSE_PORTRAIT);
            }
            else if (orientation == Configuration.ORIENTATION_LANDSCAPE){
                activity.setRequestedOrientation(SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
            }
        }
    }

    /** Unlocks the device window in user defined screen mode. */
    public static void unlockOrientation(Activity activity) {
        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER);
    }

}

0

উপরে @pstoppani এর উত্তরের জামারিন রূপান্তরটি এখানে।

দ্রষ্টব্য: এটি কোনও খণ্ডের জন্য, ক্রিয়াকলাপটি প্রতিস্থাপন করুন এই সাথে যদি কোনও ক্রিয়াকলাপের মধ্যে ব্যবহার করা হয়।

public void LockRotation()
{
    ScreenOrientation orientation;

    var surfaceOrientation = Activity.WindowManager.DefaultDisplay.Rotation;

    switch (surfaceOrientation) {
        case SurfaceOrientation.Rotation0:
            orientation = ScreenOrientation.Portrait;
            break;
        case SurfaceOrientation.Rotation90:
            orientation = ScreenOrientation.Landscape;
            break;
        case SurfaceOrientation.Rotation180:
            orientation = ScreenOrientation.ReversePortrait;
            break;
        default:
            orientation = ScreenOrientation.ReverseLandscape;
            break;
    }

    Activity.RequestedOrientation = orientation;
}

public void UnlockRotation()
{
    Activity.RequestedOrientation = ScreenOrientation.Unspecified;
}

এটি ব্যবহারের আগে আলাদা পদ্ধতির সাথে অনটিস্টেট করা হলেও এটি কার্যকর হতে পারে।


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