অ্যাকশনবারের উচ্চতা কিভাবে পাবেন?


190

আমি ActionBarযখনই কোনও কার্যকলাপ তৈরি করা হয় তখনই (শার্লক ব্যবহার করে) উচ্চতা পাওয়ার চেষ্টা করছি (বিশেষত রোটেশনে কনফিগারেশন পরিবর্তনগুলি পরিচালনা করতে যেখানে অ্যাকশনবারের উচ্চতা পরিবর্তন হতে পারে)।

এর জন্য আমি পদ্ধতিটি ব্যবহার করি ActionBar.getHeight()যা কেবল যখন ActionBarদেখানো হয় তখনই কাজ করে ।

প্রথম কার্যকলাপ প্রথমবারের তৈরি করা হয়, আমি কল করতে পারেন getHeight()মধ্যে onCreateOptionsMenuকলব্যাক। তবে এই পদ্ধতিটি পরে বলা হয় না।

সুতরাং আমার প্রশ্ন হ'ল আমি কখন getHeight () কল করতে পারি এবং আশ্বস্ত করা যায় যে এটি 0 না ফেরায়? বা যদি এটি সম্ভব না হয় তবে আমি কীভাবে অ্যাকশনবারের উচ্চতা নির্ধারণ করতে পারি?

উত্তর:


418

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

// Calculate ActionBar height
TypedValue tv = new TypedValue();
if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true))
{
    Int actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
}

কোটলিন :

val tv = TypedValue()
if (requireActivity().theme.resolveAttribute(android.R.attr.actionBarSize, tv, true)) {
    val actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data, resources.displayMetrics)
}

13
অসামান্য সাহায্য !! তবে কোথা থেকে আপনি এই জাতীয় জিনিসগুলি আবিষ্কার করেন !!
বিকি

5
সাধারণত সম্পূর্ণ বিকাশকারী গুগলিং বা বিকাশকারী হ্যান্ডবুকের মাধ্যমে ছোঁয়া। আমি মনে করি এই ক্ষেত্রেটি তবে, তবে এটি একটি সময় হয়ে গেছে।
এন্থনি

1
আমরা কি কোনও নির্দিষ্ট ক্রিয়াকলাপের জন্য অ্যাকশনবারের আকারটি পরিবর্তন করতে পারি?
সুদর্শন ভাট

এটি উভয় ক্ষেত্রেই আমার পক্ষে কাজ করেছে: (i) অনক্রিটভিউ এবং (ii) অন কনফিগারেশন পরিবর্তন হয়েছে। ধন্যবাদ!
মার্সেলো নোগুতি

5
"অ্যান্ড্রয়েড.আর.অ্যাটার্টিঅ্যাকশনবারসাইজ" অ্যান্ড্রয়েড সংস্করণ ২.৩ এ কাজ করছে না, তবে "আর.আটার.অ্যাকশনবার্সসাইজ" অ্যান্ড্রয়েডের সমস্ত সংস্করণে কাজ করছে। কেবলমাত্র "অ্যান্ড্রয়েড.আর.অ্যাটার্টিফিকেশনবারসাইজ", "android.support.v7.appcompat.R.attr.actionBarSize" এবং ইত্যাদির পরিবর্তে "R.attr.actionBarSize" ব্যবহার করুন
নাথানিয়েল জবস

147

এক্সএমএলে আপনার এই বৈশিষ্ট্যটি ব্যবহার করা উচিত:

android:paddingTop="?android:attr/actionBarSize"

20
আপনি যদি অ্যাকশনবারকম্প্যাট "@ মাত্রা / abc_action_bar_default_height" ব্যবহার করছেন
আলী আলনোইমি

10
ধন্যবাদ আলি আলনোইমি! অ্যাপকম্প্যাট ভি 21 এর সাথে নামটি পরিবর্তিত হয়েছে: "@ মাত্রা / অ্যাবসি_অ্যাকশন_বার_ডিফল্ট_হাইট_ম্যাটরিয়াল"
টনি সেরালভা

5
@ মুজিকান্ত যেমন নীচে উল্লিখিত হয়েছে, অ্যাপকম্পেটের জন্য, আপনি কোডটিতে এটি ব্যবহার করতে চান তবে সঠিক বৈশিষ্ট্যটি android.support.v7.appcompat.R.attr.actionBarSize। আপনি যদি এটি লেআউট এক্সএমএল ব্যবহার করতে চান android:paddingTop="?attr/actionBarSize",। সর্বত্র সূক্ষ্ম কাজ করে।
আরপট্টবী

1
আপনি যখন কোনও কাস্টম এক্সএমএল ফ্রেমআউট ব্যবহার করছেন তখন এই সমাধানটি দুর্দান্ত।
ট্রাইপ

2
আমি যদি এই অ্যাটর্স ব্যবহার করতে চাই তবে নেতিবাচক প্যাডিং সহ এটি ব্যবহার করতে পারি। আমি এটা কিভাবে করবো?
বাঘ বিকাশকারী

17

ঠিক আছে আমি ঘুরে বেড়াচ্ছিলাম এবং বেশ কয়েকবার এই পোস্টে পৌঁছেছিলাম তাই আমি মনে করি কেবল শার্লকের জন্যই নয় তবে অ্যাপক্যাম্পেটের জন্যও এটি বর্ণনা করা ভাল হবে:

অ্যাপকম্প্যাট ব্যবহার করে অ্যাকশন বারের উচ্চতা

@ অ্যান্টনি বর্ণনার সাথে খুব সুন্দর আপনি নিম্নলিখিত কোড সহ এটি সন্ধান করতে পারেন (আমি স্রেফ রিসোর্স আইডি পরিবর্তন করেছি):

TypedValue tv = new TypedValue();

if (getActivity().getTheme().resolveAttribute(R.attr.actionBarSize, tv, true))
{
    int actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
}

প্রাক স্যান্ডউইচ সমস্যা

আমার অ্যাকশন বারের উচ্চতা প্রয়োজন কারণ পূর্ববর্তী ICE_CREAM_SANDWITCH ডিভাইসে আমার ভিউটি অ্যাকশন বারকে ওভারল্যাপ করে। আমি অ্যান্ড্রয়েড: লেআউট_মার্জিনটপ = "? অ্যান্ড্রয়েড: অ্যাট্রি / অ্যাকশনবারসাইজ", অ্যান্ড্রয়েড: লেআউট_মার্জিনটপ = "? অ্যাট্রি / অ্যাকশনবারসাইজ" সেট করার চেষ্টা করেছি, কাস্টম থিমের সাথে ওভারল্যাপটি সেট করে এমনকি কাস্টম থিম সহ অ্যাকশনবারের উচ্চতা স্থির করেছি কিন্তু কিছুই কার্যকর হয়নি। এটি দেখতে যেমন:

ওভারল্যাপ সমস্যা

দুর্ভাগ্যক্রমে আমি জানতে পেরেছি যে উপরে বর্ণিত পদ্ধতিটি দিয়ে আমি উচ্চতার অর্ধেক অংশ পেয়েছি (আমি ধরে নিলাম যে বিকল্পগুলি বারটি নেওয়া হয়নি) সুতরাং সম্পূর্ণরূপে এই সমস্যাটি ঠিক করার জন্য আমাকে বারের উচ্চতা দ্বিগুণ করতে হবে এবং সবকিছু ঠিক আছে বলে মনে হচ্ছে:

ওভারল্যাপ স্থির

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

শুভেচ্ছা সহ,

hris.to


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

আমি কেবল অ্যাকশনবারের উচ্চতার কথা বিবেচনা করছিলাম বলে আমি সমস্যার মুখোমুখি হয়েছি, তারপরে আমি পাশাপাশি 'বিজ্ঞপ্তি বারের' উচ্চতাও যুক্ত করেছি। এটা আমার জন্য ভাল কাজ করেছে।
দর্পণ

আপনি ফ্রেমলআউট ব্যবহার করেন এবং আছে layout_gravity="center_vertical"? এটিতে পরিবর্তন করুন "bottom"। অ্যান্ড্রয়েড 2.3 নতুন অ্যান্ড্রয়েডের তুলনায় ফ্রেমলয়েউটে মার্জিনটি পরিচালনা করে।
অলিভ

16

@ অ্যান্থনি উত্তর ডিভাইসগুলির পক্ষে কাজ করে যা সমর্থন করে ActionBarএবং কেবলমাত্র Sherlock Action Barনিম্নলিখিত পদ্ধতিটি সমর্থন করে এমন ডিভাইসগুলির জন্য অবশ্যই ব্যবহার করা উচিত

    TypedValue tv = new TypedValue();
    if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true))
        actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());

    if(actionBarHeight ==0 && getTheme().resolveAttribute(com.actionbarsherlock.R.attr.actionBarSize, tv, true)){
            actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
    }

   //OR as stated by @Marina.Eariel
   TypedValue tv = new TypedValue();
   if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB){
      if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true))
        actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
   }else if(getTheme().resolveAttribute(com.actionbarsherlock.R.attr.actionBarSize, tv, true){
        actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
   }

পুরানো অ্যান্ড্রয়েড সংস্করণগুলিতে রানটাইম ত্রুটিগুলি এড়াতে "if (বিল্ড.ভি.এস.আর।
মেরিনা.এরিয়েল

আমার com.actionbarsherlock.R.attr.actionBarSizeজন্য অ্যান্ড্রয়েড 2.3 এবং 4.0 উভয়ের জন্যই কাজ করেছেন, সুতরাং দেখে মনে হচ্ছে আপনি অ্যান্ড্রয়েড সংস্করণ নির্বিশেষে এটিকে ব্যবহার করতে পারেন।
ফেলিক্স

13

আমি মনে করি সবচেয়ে নিরাপদ উপায় হ'ল:

private int getActionBarHeight() {
    int actionBarHeight = getSupportActionBar().getHeight();
    if (actionBarHeight != 0)
        return actionBarHeight;
    final TypedValue tv = new TypedValue();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true))
            actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data, getResources().getDisplayMetrics());
    } else if (getTheme().resolveAttribute(com.actionbarsherlock.R.attr.actionBarSize, tv, true))
        actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data, getResources().getDisplayMetrics());
    return actionBarHeight;
}

9
আপনি যদি অ্যাপকম্প্যাট ব্যবহার করছেন তবে নিম্নলিখিতটি যুক্ত করুন:else if (true == getTheme().resolveAttribute( android.support.v7.appcompat.R.attr.actionBarSize, tv, true)) { actionBarHeight = TypedValue.complexToDimensionPixelSize( tv.data,getResources().getDisplayMetrics()); }
মুজিকান্ত

3
"যদি (সত্য =="? আমি মনে করি আপনি "সত্য" ... অপসারণ করতে পারবেন ... :)
অ্যান্ড্রয়েড বিকাশকারী

হ্যাঁ, আপনি ঠিক বলেছেন ... এটি কেবল স্বচ্ছতার জন্য যুক্ত করা হয়েছে
মুজিকান্ত

আপনার কোড থেকে দেখে মনে হচ্ছে এটি এ বি এস ব্যবহার করছে না, HONEYCOMB- র উপরের সমস্ত সংস্করণে এটি অ্যান্ড্রয়েড.আর.অ্যাটার্টিফিকেশনবারসাইজ থেকে অ্যাকশনবারের উচ্চতা নেবে। এটা কি সঠিক ?
আসফকে

পর্দার উপরের অংশটি আড়াল করার জন্য এটি অর্ধ অ্যাকশন বারটি নির্দিষ্ট করে দেওয়া যায় কি? stackoverflow.com/questions/27163374/…
স্টিভ

6

উচ্চতা নির্ধারণ ActionBarকরতে আপনি এর Themeমতো নতুন তৈরি করতে পারেন :

<?xml version="1.0" encoding="utf-8"?>
<resources>   
    <style name="Theme.FixedSize" parent="Theme.Sherlock.Light.DarkActionBar">
        <item name="actionBarSize">48dip</item>
        <item name="android:actionBarSize">48dip</item> 
    </style> 
 </resources>

এবং Themeএটি আপনার সেট করুন Activity:

android:theme="@style/Theme.FixedSize"

1
লক্ষ করুন যে অ্যাকশন বারের উচ্চতা ল্যান্ডস্কেপ মোডে ছোট।
মার্ক বুয়েকিমা

অ্যাকশনবারের উচ্চতা সিদ্ধান্ত নেওয়ার সময় অ্যাকশনবারশারলক অনেক বিবেচনায় নেয় বলে আমি এটি প্রস্তাব করি না। আপনি যদি এটি করেন তবে অ্যাকশনবারের উচ্চতা ডিভাইস স্পেসের উপর ভিত্তি করে তৈরি করা হবে না এবং তাই নির্দিষ্ট ডিভাইসের জন্য মান উচ্চতার মতো দেখাবে না।
ক্রিস স্প্রেগ

5

জাভা:

    int actionBarHeight;
    int[] abSzAttr;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        abSzAttr = new int[] { android.R.attr.actionBarSize };
    } else {
        abSzAttr = new int[] { R.attr.actionBarSize };
    }
    TypedArray a = obtainStyledAttributes(abSzAttr);
    actionBarHeight = a.getDimensionPixelSize(0, -1);

XML:

    ?attr/actionBarSize

5

আপনি যদি অ্যাকশনবার হিসাবে কোনও সরঞ্জামদণ্ড ব্যবহার করেন,

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

তারপরে কেবলমাত্র সরঞ্জামদণ্ডের বিন্যাস_ উচ্চতাটি ব্যবহার করুন।

int actionBarHeight = toolbar.getLayoutParams().height;

3

আপনি অ্যাকশনবারের উচ্চতা পেতে এই ফাংশনটি ব্যবহার করতে পারেন।

public int getActionBarHeight() {
    final TypedArray ta = getContext().getTheme().obtainStyledAttributes(
            new int[] {android.R.attr.actionBarSize});
    int actionBarHeight = (int) ta.getDimension(0, 0);
    return actionBarHeight;
}

2

এই সহায়ক পদ্ধতিটি কারও পক্ষে কার্যকর হওয়া উচিত। উদাহরণ:int actionBarSize = getThemeAttributeDimensionSize(this, android.R.attr.actionBarSize);

public static int getThemeAttributeDimensionSize(Context context, int attr)
{
    TypedArray a = null;
    try{
        a = context.getTheme().obtainStyledAttributes(new int[] { attr });
        return a.getDimensionPixelSize(0, 0);
    }finally{
        if(a != null){
            a.recycle();
        }
    }
}

2

আপনাকে কেবল এটি যুক্ত করতে হবে।

public int getActionBarHeight() {
        int height;

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            height = getActivity().getActionBar().getHeight();
        } else {
            height = ((ActionBarActivity) getActivity()).getSupportActionBar().getHeight();

        }
        return height;
    }

2

আমি এটি আবিষ্কার করার জন্য আরও সাধারণ উপায় পেয়েছি:

  int[] location = new int[2];
  mainView.getLocationOnScreen(location);
  int toolbarHeight = location[1];

যেখানে ' মেইনভিউ ' হ'ল আপনার বিন্যাসের মূল দৃশ্য।

অ্যাকশনবার (বা সরঞ্জামদণ্ড) এর ঠিক নীচে সেট করা হওয়ায় ধারণাটি মূলত মেইনভিউয়ের ওয়াই অবস্থান পেতে পারে।


2

প্রয়োগ করা থিম অনুসারে অ্যাকশন বারের উচ্চতা পৃথক। আপনি যদি অ্যাপকম্প্যাটঅ্যাক্টিভিটি ব্যবহার করছেন তবে উচ্চতা সাধারণ ক্রিয়াকলাপের থেকে বেশিরভাগ ক্ষেত্রেই পৃথক হবে।

আপনি যদি অ্যাপকোম্প্যাটএটিভিটি ব্যবহার করছেন তবে আপনার অ্যান্ড্রয়েডের পরিবর্তে আর.আরট্রেসিটিবারসাইজ ব্যবহার করা উচিত R

public static int getActionBarHeight(Activity activity) {
        TypedValue typedValue = new TypedValue();

        int attributeResourceId = android.R.attr.actionBarSize;
        if (activity instanceof AppCompatActivity) {
            attributeResourceId = R.attr.actionBarSize;
        }

        if (activity.getTheme().resolveAttribute(attributeResourceId, typedValue, true)) {
            return TypedValue.complexToDimensionPixelSize(typedValue.data, activity.getResources().getDisplayMetrics());
        }

        return (int) Math.floor(activity.getResources()
                .getDimension(R.dimen.my_default_value));
    }

2

এক্সএমএলে, আপনি? অ্যাট্রি / অ্যাকশনবারসাইজ ব্যবহার করতে পারেন, তবে জাভাতে যদি আপনার সেই মানটি অ্যাক্সেসের প্রয়োজন হয় তবে আপনাকে নীচের কোডটি ব্যবহার করতে হবে:

public int getActionBarHeight() {
        int actionBarHeight = 0;
        TypedValue tv = new TypedValue();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv,
                    true))
                actionBarHeight = TypedValue.complexToDimensionPixelSize(
                        tv.data, getResources().getDisplayMetrics());
        } else {
            actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,
                    getResources().getDisplayMetrics());
        }
        return actionBarHeight;
    }

2

সর্বাধিক জনপ্রিয় উত্তরটি পূরণ করার জন্য একটি প্রস্তুত পদ্ধতি:

public static int getActionBarHeight(
  Activity activity) {

  int actionBarHeight = 0;
  TypedValue typedValue = new TypedValue();

  try {

    if (activity
      .getTheme()
      .resolveAttribute(
        android.R.attr.actionBarSize,
        typedValue,
        true)) {

      actionBarHeight =
        TypedValue.complexToDimensionPixelSize(
          typedValue.data,
          activity
            .getResources()
            .getDisplayMetrics());
    }

  } catch (Exception ignore) {
  }

  return actionBarHeight;
}

2

কোটলিনের সাথে আপডেট হওয়া সংস্করণটি আমি ধরে নিলাম ফোনটি হানিকম্বের চেয়ে বেশি:

val actionBarHeight = with(TypedValue().also {context.theme.resolveAttribute(android.R.attr.actionBarSize, it, true)}) {
            TypedValue.complexToDimensionPixelSize(this.data, resources.displayMetrics)
        }

1

আপনি যদি জামারিন / সি # ব্যবহার করে থাকেন তবে এটি আপনার সন্ধানের কোড:

var styledAttributes = Context.Theme.ObtainStyledAttributes(new[] { Android.Resource.Attribute.ActionBarSize });
var actionBarSize = (int)styledAttributes.GetDimension(0, 0);
styledAttributes.Recycle();

1
The action bar now enhanced to app bar.So you have to add conditional check for getting height of action bar.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
   height = getActivity().getActionBar().getHeight();
 } else {
  height = ((ActionBarActivity) getActivity()).getSupportActionBar().getHeight();
}

0

অ্যাকশনবারের উচ্চতা সন্ধান করার একটি সহজ উপায় ক্রিয়াকলাপ onPrepareOptionMenuপদ্ধতি থেকে ।

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
           ....
           int actionBarHeight = getActionBar().getHeight());
           .....
    }

0

জাভাফ্যাক্সে (গ্লুন ব্যবহার করে) উচ্চতা রানটাইম বা এটির মতো কিছুতে সেট করা থাকে। সাধারণের মতো প্রস্থটি অর্জন করতে সক্ষম হয়ে ...

double width = appBar.getWidth();

আপনাকে শ্রোতা তৈরি করতে হবে:

GluonApplication application = this;

application.getAppBar().heightProperty().addListener(new ChangeListener(){
    @Override
    public void changed(ObservableValue observable, Object oldValue, Object newValue) {
        // Take most recent value given here
        application.getAppBar.heightProperty.get()
    }
});

... এবং এটিতে পরিবর্তিত সর্বশেষতম মানটি ধরুন। উচ্চতা পেতে।


0

সাফল্য ছাড়াই বাহিরে সমস্ত কিছু চেষ্টা করার পরে, আমি আবিষ্কার করেছিলাম, দুর্ঘটনাক্রমে, অ্যাকশন বারের ডিফল্ট উচ্চতা পাওয়ার জন্য একটি কার্যকরী এবং খুব সহজ উপায়।

কেবলমাত্র 25 এবং 24 এআইপি-তে পরীক্ষা করা হয়েছে

সি শার্প

Resources.GetDimensionPixelSize(Resource.Dimension.abc_action_bar_default_height_material); 

জাভা

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