অ্যান্ড্রয়েডে স্ট্যাটাস বারের উচ্চতা


332

অ্যান্ড্রয়েডের স্ট্যাটাস বারের উচ্চতা কত? সবসময় কি একই রকম?

আমার পরিমাপ থেকে মনে হয় এটি 25 ডিপি, তবে আমি নিশ্চিত না যে এটির সমস্ত প্ল্যাটফর্মে একই উচ্চতা রয়েছে কিনা।

(আমি স্থিতি দণ্ডবিহীন এমন ক্রিয়াকলাপ থেকে বিবর্ণ রূপান্তরটি সঠিকভাবে প্রয়োগ করতে এটি জানতে চাই)


আপনি যদি ক্রস ফেইড করেন তবে আপনার স্ট্যাটাস বারের উচ্চতা জানতে হবে না।
স্টিলথকপ্টার

2
আমার এটি দরকার কারণ কিছু উপাদান বিন্যাসকে কেন্দ্র করে এবং আমি সেগুলি একে অপরের সাথে বিবর্ণ করতে চাই।
এইচপিমিক

উত্তর:


363

এই প্রশ্নের উত্তর আগে দেওয়া হয়েছিল ... স্ট্যাটাসবারের উচ্চতা?

আপডেট ::

বর্তমান পদ্ধতি:

ঠিক আছে, স্ট্যাটাস বারের উচ্চতা স্ক্রিনের আকারের উপর নির্ভর করে, উদাহরণস্বরূপ 240 এক্স 320 পর্দার আকারযুক্ত কোনও ডিভাইসে স্ট্যাটাস বারের উচ্চতা 20px, 320 এক্স 480 স্ক্রিন আকারের কোনও ডিভাইসের জন্য স্ট্যাটাস বারের উচ্চতা 25px হয়, 480 x 800 সহ ডিভাইসটির স্ট্যাটাস বারের উচ্চতা 38px হওয়া আবশ্যক

সুতরাং আমি স্থিতি বারের উচ্চতা পেতে এই স্ক্রিপ্টটি ব্যবহার করার পরামর্শ দিই

Rect rectangle = new Rect();
Window window = getWindow();
window.getDecorView().getWindowVisibleDisplayFrame(rectangle);
int statusBarHeight = rectangle.top;
int contentViewTop = 
    window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
int titleBarHeight= contentViewTop - statusBarHeight;

   Log.i("*** Elenasys :: ", "StatusBar Height= " + statusBarHeight + " , TitleBar Height = " + titleBarHeight); 

(পুরানো পদ্ধতি) onCreate()আপনার ক্রিয়াকলাপের পদ্ধতিতে স্থিতি বারের উচ্চতা পেতে , এই পদ্ধতিটি ব্যবহার করুন:

public int getStatusBarHeight() { 
      int result = 0;
      int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
      if (resourceId > 0) {
          result = getResources().getDimensionPixelSize(resourceId);
      } 
      return result;
} 

বেপারটা এমন না. আমি আরও জিজ্ঞাসা করছি যে আমি যদি ধরে নিতে পারি যে স্থিতি দণ্ডের সমস্ত ডিভাইসে একই উচ্চতা রয়েছে।
এইচপিক

16
নাকি ডিপ ব্যবহার করবেন? যদি এটির সর্বদা 25 ডিপ থাকে তবে কোডটির প্রয়োজন নেই।
এইচপিক

8
আপনি এটি সর্বদা 25 ডিপি ধরে নিতে পারবেন না (উদাহরণস্বরূপ প্রজ্বলিত আগুনের উচ্চতাটি দেখুন)।
ডালিনডায়ার

1
অনক্রিট () এ পোষ্ট () - এ ফিরে 0
আইএক্সএক্স

4
window.getDecorView().getWindowVisibleDisplayFrame(rectangle)আপনি যদি একাধিক উইন্ডো মোডে + প্রতিকৃতি ঘূর্ণন + দ্বিতীয় উইন্ডোতে থাকেন তবে স্ট্যাটাস বারের উচ্চতা পাওয়ার সঠিক উপায় নয়। আপনি একটি বিশাল মান পাবেন (1 ম উচ্চতা অন্তর্ভুক্ত)।
তুয়ান চাউ

211

স্ট্যাটাস বারের উচ্চতা পেতে আমি যে সমস্ত কোডের নমুনা ব্যবহার করেছি সেগুলির মধ্যে কেবলমাত্র একটির onCreateপদ্ধতিতে বাস্তবে কাজ করতে দেখা যায় এটি Activityহ'ল:

public int getStatusBarHeight() {
    int result = 0;
    int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
    if (resourceId > 0) {
        result = getResources().getDimensionPixelSize(resourceId);
    }
    return result;
}

স্পষ্টতই স্থিতি দণ্ডের আসল উচ্চতা অ্যান্ড্রয়েড সংস্থান হিসাবে রাখা হয়েছে। উপরের কোডটি একটি ContextWrapperশ্রেণিতে যুক্ত করা যেতে পারে (যেমন একটি Activity)।

Http://mrtn.me/blog/2012/03/17/get-the-height-of-the-status-bar-in-android/ এ পাওয়া গেছে


এটিকে হার্ড কোডিংয়ের পরিবর্তে গতিশীলভাবে গণনা করা ভাল। উপরের পদ্ধতিটি আমার পক্ষে কাজ করেছিল!
আলকেমিস্ট

পরিবর্তে আপনি getDimesion (...) ব্যবহার করবেন না?
অ্যান্ড্রয়েড বিকাশকারী

6
সাবধানতার একটি শব্দ - এটি সমস্ত ডিভাইসে কাজ করে না। উদাহরণস্বরূপ ট্রান্সফর্মার টিএফ201 (পাশাপাশি টিএফ 101, টিএফ 300 এবং কিছু অন্যান্য ডিভাইস) উচ্চতা 25 হিসাবে রিপোর্ট করা হয় যেখানে কোনও স্ট্যাটাস বার নেই।
Błażej Czapp

4
উপরের মন্তব্যের উপর ভিত্তি করে, আমার কাছে মনে হচ্ছে কোডটি আপনাকে নির্দিষ্ট ডিভাইসে স্ট্যাটাস বারের উচ্চতা কী - তা কোনও নির্দিষ্ট ক্রিয়াকলাপে যা রয়েছে তা নয় (যা আসলে কোনও স্ট্যাটাস বার নাও থাকতে পারে)।
ধাঁধা

এক্সএমএলে দ্বিমাংশ উত্স "@ অ্যান্ড্রয়েড: মাত্রা / স্থিতি_বার_উত্তর" ব্যবহার করা যেতে পারে <! - অ্যান্ড্রয়েড সিস্টেম উত্স ফাইলে সংজ্ঞায়িত স্ট্যাটাস বারের উচ্চতা -> <মাত্রা নাম = "স্ট্যাটাস_বার_হাইট"> 24 ডিপি </ ডিমেন>। তবে আপনি আপনার অ্যাপ্লিকেশন প্রকল্পে এটি সরাসরি উল্লেখ করতে পারবেন না। সুতরাং আপনি কোড ব্যবহার করা আবশ্যক।
শুঙ্গলি

48

এমডিপিআই ডিভাইসে, স্ট্যাটাস বারটি 25px হয় is আমরা এটিকে বেস হিসাবে ব্যবহার করতে পারি এবং যেকোন ডিভাইসে স্থিতি দণ্ডের উচ্চতা পেতে এটি ঘনত্বের (বৃত্তাকার) দ্বারা গুণ করতে পারি:

int statusBarHeight = Math.ceil(25 * context.getResources().getDisplayMetrics().density);

রেফারেন্সের জন্য: ldpi = .75, এমডিপিআই = 1, এইচডিপিআই = 1.5, এক্সএইচডিপিআই = 2


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

1
25px মানটি সমস্ত এমডিপিআই ডিভাইসের জন্য সঠিক নয়। এটি এপিআই স্তরের উপর নির্ভর করে পরিবর্তিত হতে পারে। উদাহরণস্বরূপ, 10.1 ডাব্লুএক্সজিএ ট্যাবলেট এমুলেটর ডিভাইসটি API 16 এবং 19 এ 25px প্রতিবেদন করে, তবে 24px এপিআই 24.
jk7

এই পিনহোল এবং খাঁজ সঙ্গে কাজ করে?
bellit

48

আকারটি হার্ডকোডিং করা বা তার প্রতিফলন ব্যবহার করে এর মান পাওয়া status_bar_heightখারাপ অভ্যাস হিসাবে বিবেচিত। ক্রিস ব্যানস ড্রয়েডকন নিউইয়র্কে এই বিষয়ে কথা বলেছেন । স্থিতি দণ্ডের আকারটি পাওয়ার প্রস্তাবিত উপায়টি অনপ্লাই উইন্ডোআইনেসলেটলিস্টারের মাধ্যমে :

myView.setOnApplyWindowInsetsListener { view, insets -> {
  val statusBarSize = insets.systemWindowInsetTop
  return insets
}

এটি এপিআই 20 এ যুক্ত হয়েছিল এবং ভিউ অ্যাপকম্পেটের মাধ্যমেও ব্যাকপোর্ট করা হয়েছে


এটি আজকের সবচেয়ে সঠিক উত্তর
কিথ

আমার জন্য এটি কেবল একবারেই জ্বলতে থাকে, যদি আমার নীচের অংশের নাভির মাধ্যমে খণ্ড থাকে। আমি যদি আবার খণ্ডটি প্রতিস্থাপন করি, তবে এই শ্রোতার কল হবে না, সেখানে কি কমপ্যাট গেটার রয়েছে?
urSus

74
এবং তবুও এই এপিআই ভয়ঙ্কর, কারণ পর্দার পিছনে ডাব্লুটিএফ / গটছের সংখ্যা বিশাল। আপনি যে কোনও দৃষ্টিভঙ্গি দিয়ে এটি করতে পারবেন তা ভাবতে চাইবেন, তবে না, আপনাকে কিছু জিনিসকে ওভাররাইড করতে হবে এবং আপনার বাচ্চাদের (??) পোকামাকড়গুলি পাস করার বিষয়টি নিশ্চিত করতে হবে কারণ কিছু ভিউগ্রুপগুলি (উপাদান নকশা) করবে এবং অন্যরা তা করবে না ( লিনিয়ার লেআউট? কনস্ট্রেন্টলআউট? হ্যালো?) উইন্ডো.গেটস্ট্যাটাসবারসাইজ () থাকা সিস্টেমের পরিবর্তে ... আমাদের একটি বিস্মৃতকর তালিকার জন্য সাবস্ক্রাইব করতে হবে ... হোম অ্যান্ড্রয়েডে যান, আপনি মাতাল হয়ে আছেন। গুগল জাগ্রত না হওয়া অবধি কেবল আকারটি হার্ডকোড করুন, আমরা 2018 এ আছি I আমি আশা করি ক্রিস বেনস এই একদিন দেখবে…
মার্টিন মার্কনকিনি

আমার ক্ষেত্রে এটি বরখাস্ত করা হচ্ছে না। আমি এটিকে ক্রিয়াকলাপ # টি দিয়েছি। আমি কি কিছু ভুল করবেন? অতিরিক্তভাবে কেন আমরা mView.getRootWindowInsets () ব্যবহার করি না?
আদিল আলিয়েভ

34

আমি কিছু সমাধান একসাথে একত্রিত করেছি:

public static int getStatusBarHeight(final Context context) {
    final Resources resources = context.getResources();
    final int resourceId = resources.getIdentifier("status_bar_height", "dimen", "android");
    if (resourceId > 0)
        return resources.getDimensionPixelSize(resourceId);
    else
        return (int) Math.ceil((VERSION.SDK_INT >= VERSION_CODES.M ? 24 : 25) * resources.getDisplayMetrics().density);
    }

অন্য বিকল্প:

    final View view = findViewById(android.R.id.content);
    runJustBeforeBeingDrawn(view, new Runnable() {
        @Override
        public void run() {
            int statusBarHeight = getResources().getDisplayMetrics().heightPixels - view.getMeasuredHeight();
        }
    });

সম্পাদনা: রানস্টাল বিকল্প বিকল্প বিইংড্রন: https://stackoverflow.com/a/28136027/878126


getRes উত্স ()। getDisplayMetics ()। উচ্চতাপিক্সেল -getActivity ()। FindViewById (android.R.id.content) .getMeasuredHeight () অ্যান্ড্রয়েড
ললিপপে

@ ArMo372 আপডেট উত্তর। এটি কেবলমাত্র ভিউটির প্রথমে পরিমাপটি পাস করতে হবে। আপনি যদি ইতিমধ্যে এটি পাস করে থাকেন তবে আপনাকে জাস্টবাইফরবইনড্রিং ব্যবহার করার দরকার নেই। আপনি এটি কেবল খুব তাড়াতাড়ি ক্ষেত্রে ব্যবহার করবেন।
অ্যান্ড্রয়েড বিকাশকারী

28

গুগল ডিজাইনের গাইডলাইন অনুসারে ; স্ট্যাটাস বারের উচ্চতা 24 ডিপি।

আপনি যদি পিক্সেলগুলিতে স্ট্যাটাস বারের উচ্চতা পেতে চান তবে নীচের পদ্ধতিটি ব্যবহার করতে পারেন:

private static int statusBarHeight(android.content.res.Resources res) {
    return (int) (24 * res.getDisplayMetrics().density);
}

যার সাথে ক্রিয়াকলাপ থেকে কল করা যেতে পারে:

statusBarHeight(getResources());

18
মার্শমেলো অবধি এটি 25 ডিপি ছিল। মার্শমেলো যেহেতু এটি 24 ডিপি।
ইউজেন পেচানেক

1
কোন নকশাটি পরিবর্তনের জন্য অনুমতি দেয় না - এই মূলত মান hardcoding হয়
siliconeagle

1
এবং এটা সত্য যে স্ট্যাটাস বার একই মামলায় প্রদর্শিত হবে না হিসাব নেই
jk7

19

ডিফল্ট উচ্চতা 25 ডিপি ব্যবহৃত হত। অ্যান্ড্রয়েড মার্শমেলো (এপিআই 23) এর সাথে উচ্চতা 24 ডিপি করা হয়েছিল।

আপডেট: দয়া করে সচেতন থাকুন যেহেতু খাঁজ এবং পাঞ্চ-পুরো-ক্যামেরার বয়স শুরু হয়েছে, স্ট্যাটাস বারের জন্য একটি স্থির উচ্চতা ব্যবহার করে আর কাজ করে না। পরিবর্তে উইন্ডো ইনসেট ব্যবহার করুন!


1
মিষ্টি! আমি মাত্র 23++ API স্তরের জন্য একটি ডাইমেনস.এমএমএল তৈরি করেছি যেখানে উচ্চতা 24 ডিপি হিসাবে হার্ডকড করেছি।
কেউ কেউ কোথাও

18

এটি রেফারেন্স লিঙ্কের সাথেও কাজ করে

public int getStatusBarHeight() {
  int result = 0;
  int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
  if (resourceId > 0) {
      result = getResources().getDimensionPixelSize(resourceId);
  }
  return result;
}

13

অনক্রিটে স্ট্যাটাস বারের উচ্চতা পেতে আমার একই সমস্যা রয়েছে। এটি আমার পক্ষে কাজ করে।

private static final int LOW_DPI_STATUS_BAR_HEIGHT = 19;

private static final int MEDIUM_DPI_STATUS_BAR_HEIGHT = 25;

private static final int HIGH_DPI_STATUS_BAR_HEIGHT = 38;

অনক্রিটের ভিতরে:

DisplayMetrics displayMetrics = new DisplayMetrics();
((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMetrics(displayMetrics);

int statusBarHeight;

switch (displayMetrics.densityDpi) {
    case DisplayMetrics.DENSITY_HIGH:
        statusBarHeight = HIGH_DPI_STATUS_BAR_HEIGHT;
        break;
    case DisplayMetrics.DENSITY_MEDIUM:
        statusBarHeight = MEDIUM_DPI_STATUS_BAR_HEIGHT;
        break;
    case DisplayMetrics.DENSITY_LOW:
        statusBarHeight = LOW_DPI_STATUS_BAR_HEIGHT;
        break;
    default:
        statusBarHeight = MEDIUM_DPI_STATUS_BAR_HEIGHT;
}

দেখা:

http://developer.android.com/references/android/util/DisplayMetrics.html http://developer.android.com/guide/practices/ui_guidlines/icon_design.html


3
আমি আপনার ঘনত্ব-চালিত মানগুলি ব্যবহার করার ধারণাটি পছন্দ করি। আপনি যদি একাধিক স্থানে কোড ব্যবহার করতে যাচ্ছেন (বা অন্যান্য ঘনত্ব সম্পর্কিত মানগুলি ব্যবহার করুন) আমি সিস্টেমে কাজটি অফলোড করা পছন্দ করি এবং মানকে একটি মাত্রা সংস্থানতে সঞ্চয় করি যা সুইচটিকে অপ্রয়োজনীয় করে তোলে। আপনার প্রতিটি ঘনত্বের জন্য একটি মাত্রা-নির্দিষ্ট ফোল্ডার এবং রিসোর্স ফাইল তৈরি করতে হবে। চূড়ান্ত রিসোর্সেস রেস = কনটেক্সট.জেট রিসোর্সস (); int statusbarHight = 0; চেষ্টা করুন {স্ট্যাটাসবারহাইট = রেস.জেটডাইমেনশনপিক্সেলসাইজ (আর.ডাইমেন.অ্যান্ড্রয়েড_ স্ট্যাটাসবার_হাইট); } ক্যাচ (নটফাউন্ডএক্সপশন ই) {{
প্রকল্পজর্নিম্যান

5
এই মানগুলিকে হার্ডকোডিং বিপজ্জনক, যদি তারা পরবর্তী প্ল্যাটফর্মের সংস্করণে পরিবর্তন করে?
ডেভিড স্নাবেল-কাউন্ট

আমি মনে করি হার্ডকডযুক্ত পিক্সেল আকার (প্রতিটি ঘনত্বের জন্য একটি) ব্যবহার না করে "25 ডিপি" ব্যবহার করা ভাল।
অ্যান্ড্রয়েড বিকাশকারী


12

হ্যাঁ আমি যখন দেখার সাথে এটি চেষ্টা করি তখন এটি 25px এর ফলাফল সরবরাহ করে। পুরো কোডটি এখানে:

public class SpinActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        LinearLayout lySpin = new LinearLayout(this);
        lySpin.setOrientation(LinearLayout.VERTICAL);       
        lySpin.post(new Runnable()
        {
            public void run()
            {
                Rect rect = new Rect();
                Window window = getWindow();
                window.getDecorView().getWindowVisibleDisplayFrame(rect);
                int statusBarHeight = rect.top;
                int contentViewTop = 
                    window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
                int titleBarHeight = contentViewTop - statusBarHeight;
                System.out.println("TitleBarHeight: " + titleBarHeight 
                    + ", StatusBarHeight: " + statusBarHeight);
            }
        }
    }
}

উপরের কোডটি আমার জন্য কাজ করছে যখন আপনি উপরে যেমনটি করেছেন তেমন একটি নতুন রৈখিক বিন্যাস তৈরি করি, তবে যখন আমি এক্সএমএল থেকে লাইস্পিনের জন্য ভিউবিবিড পাই। তারপর এটি শূন্য ফিরে। y বুঝতে পারছে না এটি এমন আচরণ করছে।
শায়েস্তা নাজ

কারণ লেআউটটি এখনও তার আকারটি অনক্রিটে জানে না কারণ এটি আঁকানো শেষ হয়নি। আমি সাধারণত যা করি তা হ'ল অনক্রিয়েট থেকে ইউআই থ্রেডে একটি রান্নেবল পোস্ট করা যা ইউআইকে নিজেকে আঁকতে সময় দেয়।
জেসন রবিনসন

8

240x320 - 20px

320x480 - 25px

480x800 + - 38px


3
এটি আর সঠিক নয়। স্ট্যাটাস বারটি পরিমাপ করার একটি পদ্ধতি ব্যবহার করুন।
মাইকেল 16

7

এটা চেষ্টা কর:

    Rect rect = new Rect();
    Window win = this.getWindow();
    win.getDecorView().getWindowVisibleDisplayFrame(rect);
    int statusBarHeight = rect.top;
    int contentViewTop = win.findViewById(Window.ID_ANDROID_CONTENT).getTop();
    int titleBarHeight = contentViewTop - statusBarHeight;
    Log.d("ID-ANDROID-CONTENT", "titleBarHeight = " + titleBarHeight );

ক্রিয়াকলাপের জন্য এটি অনক্রিট পদ্ধতিতে আমার পক্ষে কাজ করে নি, তবে যখন আমি এটি অনক্লিকলিস্টারে রেখেছিলাম এবং আমাকে 25 পরিমাপ দেয়


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

6

স্থিতি বারটির উচ্চতা অ্যানড্রয়েড 6.0 এ 24 ডিপি

 <!-- Height of the status bar -->
 <dimen name="status_bar_height">24dp</dimen>
 <!-- Height of the bottom navigation / system bar. -->
 <dimen name="navigation_bar_height">48dp</dimen>

আপনি উত্স কোডে উত্তরটি খুঁজে পেতে পারেন: ফ্রেমওয়ার্কগুলি \ বেস \ কোর \ রেজ \ রেস \ মানগুলি ime dimens.xML


আমাদের এক্সএমএলগুলিতে এই সংস্থানটি পাওয়ার কোনও উপায় আছে? @android:dimen/status_bar_heightআমার জন্য কাজ করে না
প্যাট্রিক

4

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

public int getStatusBarHeight() {
    int statusBarHeight = 0;

    if (!hasOnScreenSystemBar()) {
        int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resourceId > 0) {
            statusBarHeight = getResources().getDimensionPixelSize(resourceId);
        }
    }

    return statusBarHeight;
}

private boolean hasOnScreenSystemBar() {
    Display display = getWindowManager().getDefaultDisplay();
    int rawDisplayHeight = 0;
    try {
        Method getRawHeight = Display.class.getMethod("getRawHeight");
        rawDisplayHeight = (Integer) getRawHeight.invoke(display);
    } catch (Exception ex) {
    }

    int UIRequestedHeight = display.getHeight();

    return rawDisplayHeight - UIRequestedHeight > 0;
}

3

@ নিক্লাসকে ধন্যবাদ +1 এটি করার সঠিক উপায় এটি।

public class MyActivity extends Activity implements android.support.v4.View.OnApplyWindowInsetsListener {

    Rect windowInsets;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.my_activity);

        View rootview = findViewById(android.R.id.content);

        android.support.v4.View.ViewCompat.setOnApplyWindowInsetsListener(rootview, this);
    }

    android.support.v4.View.WindowInsetsCompat android.support.v4.View.OnApplyWindowInsetsListener.OnApplyWindowInsets(View v, android.support.v4.View.WindowInsetsCompat insets)
    {
        windowInsets = new Rect();
        windowInsets.set(insets.getSystemWindowInsetLeft(), insets.getSystemWindowInsetTop(), insets.getSystemWindowInsetRight(), insets.getSystemWindowInsetBottom());
        //StatusBarHeight = insets.getSystemWindowInsetTop();

        //Refresh/Adjust view accordingly

        return insets;
    }
}

কোডটি যদি 100% সঠিক না হয় তবে দয়া করে ক্ষমা করুন, এটিকে Xamarin C # থেকে রূপান্তরিত করুন তবে এটি কেবল এটিই। নচস ইত্যাদি নিয়ে কাজ করে


2

টোগলড পূর্ণস্ক্রিন সমাধান:

এই সমাধানটি একদম কাজের মতো দেখাতে পারে তবে এটি আসলে আপনার অ্যাপ্লিকেশন পূর্ণস্ক্রিন কিনা (ওরফে স্ট্যাটাস বারটি আড়াল করছে) কিনা তার জন্য অ্যাকাউন্টগুলি:

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point(); display.getSize(size);
int barheight = size.y - findViewById(R.id.rootView).getHeight();

এইভাবে, যদি আপনার অ্যাপ্লিকেশনটি বর্তমানে পূর্ণস্ক্রিন হয়, barheight হয় তবে 0 সমান হবে।

স্থিতি দণ্ড হিসাবে অ্যাকাউন্টে নিখুঁত টাচেন্ট স্থানাঙ্কগুলি সংশোধন করার জন্য ব্যক্তিগতভাবে আমাকে এটি ব্যবহার করতে হয়েছিল:

@Override
public boolean onTouch(View view,MotionEvent event) {
    Display display = getWindowManager().getDefaultDisplay();
    Point size = new Point(); display.getSize(size);
    int YCoord = (int)event.getRawY() - size.y + rootView.getHeight());
}

এবং এটি অ্যাপ্লিকেশনটি পুরো স্ক্রিনে থাকুক বা না থাকুক তা পরম y- সমন্বয় পাবে।

উপভোগ করুন


ধন্যবাদ, অ্যান্ড্রয়েড কীবোর্ডটি যখন দেখানো হচ্ছে তখন এটি আমার জন্য একমাত্র সমাধান ছিল।
থিয়াগো মৌরা

2

অ্যানড্রয়েড ৪.১ এবং তার থেকেও বেশি, আপনি আপনার অ্যাপ্লিকেশনটির সামগ্রীটি স্থিতি বারের পিছনে উপস্থিত হতে সেট করতে পারেন, যাতে স্ট্যাটাস বারটি লুকিয়ে ও দেখায় সামগ্রীর আকার পরিবর্তন না হয়। এটি করতে, SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN ব্যবহার করুন। আপনার অ্যাপ্লিকেশনটিকে একটি স্থিতিশীল বিন্যাস বজায় রাখতে সহায়তা করতে আপনাকে SYSTEM_UI_FLAG_LAYOUT_STABLE ব্যবহারের প্রয়োজনও হতে পারে।

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

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

ফর্ম: https://developer.android.com/training/system-ui/status.html# পিছনে


1

আপনি যদি ঠিক আকারের ভিএস উচ্চতা জানেন

মত

উদাহরণস্বরূপ 320 এক্স 480 স্ক্রিন আকারের কোনও ডিভাইসে স্ট্যাটাস বারের উচ্চতা 25px, 480 x 800 সহ একটি ডিভাইসের জন্য স্ট্যাটাস বারের উচ্চতা 38px হওয়া আবশ্যক

তারপরে আপনি নিজের দর্শনটির প্রশস্ততা / পর্দার আকার পেতে পারেন স্ট্যাটাস বারের উচ্চতা পেতে আপনি যদি অন্য কোনও বিবৃতি ব্যবহার করতে পারেন


আমার অভিজ্ঞতায় উচ্চতাটি পর্দার আকারের চেয়ে ঘনত্বের উপর নির্ভর করে বলে মনে হচ্ছে। অবশ্যই, ঘনত্ব নিজেই সাধারণত পর্দার আকারের সাথে সম্পর্কিত, তাই পরোক্ষ সম্পর্ক রয়েছে। উদাহরণস্বরূপ, আমার পুরাতন মোটো ড্রডে 480x854 (480x800 এর চেয়ে বেশি) প্রদর্শন রয়েছে এবং স্ট্যাটাস বারটি 38 পিক্সেলও বেশি।
কার্ল

তারা এর জন্য ডিপি আবিষ্কার করেছেন (ঘনত্ব স্বতন্ত্র পিক্সেল)
রোল

1

উপরের উত্তরটি কিছু লোকের পক্ষে কাজ না করার কারণ হ'ল এটি কোনও রেন্ডার প্রস্তুত না হওয়া পর্যন্ত আপনি কোনও দৃশ্যের মাত্রা পেতে পারেন না। OnGlobalLayoutListenerআপনি যখন যা করতে পারেন তা বলার জন্য একটি মাত্রা ব্যবহার করুন :

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final ViewGroup decorView = (ViewGroup) this.getWindow().getDecorView();
    decorView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            if (Build.VERSION.SDK_INT >= 16) {
                decorView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            } else {
                // Nice one, Google
                decorView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            }
            Rect rect = new Rect();
            decorView.getWindowVisibleDisplayFrame(rect);
            rect.top; // This is the height of the status bar
        }
    }
}

এটি সবচেয়ে নির্ভরযোগ্য পদ্ধতি।


1
@ অ্যান্ড্রয়েড ডেভেলপার অনগ্রোবাল! = গ্লোবাল ওন
marijnz0r

@ marijnz0r কতটা বিজোড়। এর সাথে কী চুক্তি?
অ্যান্ড্রয়েড বিকাশকারী

@ অ্যান্ড্রয়েড ডেভেলপার আমি জানি না, তবে কিছুদিন আগে আপনিও যেমনটি করেছিলেন ঠিক তেমনটাই ভাবতে পেরেছিলাম। দেখুন: stackoverflow.com/a/19216041/4587214
marijnz0r

@ marijnz0r তাই উভয়ই একই কাজ করে। আমাকে অন্যান্য কেসগুলির স্মরণ করিয়ে দেয় যে তারা ইতিমধ্যে বিদ্যমান একটি স্টাফের জন্য একটি নতুন নাম দিয়েছে এবং পূর্ববর্তীটি হ'ল। উদাহরণ "ভরাট_পিতা" "বনাম" ম্যাচ_পিতা ": বিকাশকারী.অ্যান্ড্রয়েড.
android/

1

যেহেতু এখন মাল্টি-উইন্ডো মোড উপলভ্য, আপনার অ্যাপের উপরে স্ট্যাটাসবার নাও থাকতে পারে।

সমাধান অনুসরণ করে আপনার জন্য সমস্ত মামলা স্বয়ংক্রিয়ভাবে পরিচালনা করে।

android:fitsSystemWindows="true"

বা প্রোগ্রামক্রমে

findViewById(R.id.your_root_view).setFitsSystemWindows(true);

আপনি এর মাধ্যমেও রুট ভিউ পেতে পারেন

findViewById(android.R.id.content).getRootView();
or
getWindow().getDecorView().findViewById(android.R.id.content)

রুট-ভিউ পাওয়ার বিষয়ে আরও তথ্যের জন্য দেখুন - https://stackoverflow.com/a/4488149/9640177


0

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

private val DEFAULT_INSET = 96
fun getInsets(view: View?): Int {
     var inset = DEFAULT_INSET
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//Safe because only P supports notches
          inset = view?.rootWindowInsets?.stableInsetTop ?: DEFAULT_INSET
     }
     return inset
}

fun blurView(rootView: View?, a: SpacesActivity?) {
    val screenBitmap = getBitmapFromView(rootView!!)
    val heightDifference = getInsets(rootView)
    val croppedMap = Bitmap.createBitmap(
                    screenBitmap, 0, heightDifference,
                    screenBitmap.width,
                    screenBitmap.height - heightDifference)
    val blurredScreen = blurBitmap(croppedMap)
    if (blurredScreen != null) {
         val myDrawable = BitmapDrawable(a!!.resources, blurredScreen)
         a.errorHudFrameLayout?.background = myDrawable
         a.appBarLayout?.visibility = View.INVISIBLE
   }
}

এবং তারপরে ক্রিয়াকলাপ শ্রেণিতে:

fun blurView() {
    this.runOnUiThread {
        Helper.blurView(this)
    }
}

আপনি অবশ্যই স্থিতিশীল সহায়ক শ্রেণীর পদ্ধতি প্যারামিটারের ক্রিয়াকলাপের একটি দুর্বল রেফারেন্স তৈরি করতে চাইবেন, তবে ব্রেভিটির জন্য আমি এই উদাহরণ থেকে বিরত রইলাম। blurBitmapএবং errorHudFrameLayout, একই কারণে বাদ দেওয়া হয়েছে যেহেতু তারা সরাসরি স্ট্যাটাস বার উচ্চতা প্রাপ্তির অধিকারে থাকা হবে না।


যদি এটি অ্যান্ড্রয়েড পি বা তারপরের জন্য হয় তবে অ্যান্ড্রয়েড এম দিয়ে কেন পরীক্ষা করবেন? এছাড়াও, যদি আপনার কাছে কোনও দৃষ্টান্ত নজরে না আসে তবে আপনি কী করবেন? উদাহরণস্বরূপ, যদি আপনার বর্তমানে কোনও ক্রিয়াকলাপ না থাকে ...
অ্যান্ড্রয়েড বিকাশকারী

এম সবচেয়ে শীঘ্রই আপনি স্থিরতা ইনসেটটপ চেক করতে পারতেন এবং কেবলমাত্র পি সমর্থিত নচ হলেও আমি যে স্থানে পারি সেখানে ডিফল্টটিতে ফিরে যাওয়ার পরিবর্তে প্রকৃত ইনসেটটি সম্ভব হত। আপনার কোনও কার্যকলাপ না থাকলে এই সমাধানটি কাজ করে না।
জেমস জর্দান টেলর

আমি দেখি. ধন্যবাদ. আপনি কি আরও একটি "পূর্ণ" উদাহরণ প্রদর্শন করতে পারেন?
অ্যান্ড্রয়েড বিকাশকারী

উদাহরণটিতে পদ্ধতিটি ব্যবহার করতে আমি আমার উত্তরটি পরিবর্তন করেছি।
জেমস জর্ডান টেলর

আমি একটি কাজের উদাহরণ বোঝাতে চেয়েছিলাম, তবে ঠিক আছে।
অ্যান্ড্রয়েড বিকাশকারী

0

কোটলিন সংস্করণ যা দুটি সেরা সমাধানের সম্মিলন করে

fun getStatusBarHeight(): Int {
    val resourceId = resources.getIdentifier("status_bar_height", "dimen", "android")
    return if (resourceId > 0) resources.getDimensionPixelSize(resourceId)
    else Rect().apply { window.decorView.getWindowVisibleDisplayFrame(this) }.top
}
  1. লাগে status_bar_heightউপস্থিত থাকলে মান
  2. যদি status_bar_heightউপস্থিত না থাকে, উইন্ডো সজ্জা থেকে স্থিতি বারের উচ্চতা গণনা করে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.