एक्शनबार की ऊंचाई कैसे प्राप्त करें?


190

मैं ActionBarहर बार एक गतिविधि (विशेष रूप से रोटेशन पर कॉन्फ़िगरेशन परिवर्तनों को संभालने के लिए जहां ActionBar ऊंचाई बदल सकता है) को बनाने के लिए (शर्लक का उपयोग करके) की ऊंचाई प्राप्त करने की कोशिश कर रहा हूं ।

इसके लिए मैं उस विधि का उपयोग करता हूं ActionBar.getHeight()जो ActionBarदिखाए जाने पर ही काम करती है।

जब पहली बार पहली गतिविधि बनाई जाती है, तो मैं कॉलबैक getHeight()में कॉल कर सकता हूं onCreateOptionsMenu। लेकिन इस विधि के बाद नहीं कहा जाता है।

तो मेरा सवाल यह है कि मैं गेटहाइट () को कब कॉल कर सकता हूं और आश्वस्त हो सकता हूं कि यह 0 नहीं है? या यदि यह संभव नहीं है, तो मैं एक्शनबार की ऊंचाई कैसे तय कर सकता हूं?

जवाबों:


418

जबकि @ बिरदी का उत्तर एक विकल्प है यदि आप स्पष्ट रूप से ActionBar आकार को नियंत्रित करना चाहते हैं, तो मुझे समर्थन प्रलेखन में पाए गए आकार को लॉक किए बिना इसे ऊपर खींचने का एक तरीका है। यह थोड़ा अजीब है लेकिन यह मेरे लिए काम कर रहा है। आपको एक संदर्भ की आवश्यकता होगी, यह उदाहरण एक गतिविधि में मान्य होगा।

// 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
आमतौर पर डेवलपर हैंडबुक के माध्यम से संपूर्ण Googling या ड्रगिंग से। मुझे लगता है कि इस मामले में उत्तरार्द्ध है, लेकिन यह कुछ समय रहा है।
एंथनी

1
क्या हम केवल किसी विशेष गतिविधि के लिए एक्शनबार का आकार बदल सकते हैं?
सुदर्शन भट

इसने मेरे लिए दोनों मामलों में काम किया: (i) onCreateView और (ii) onConfigurationChanged। धन्यवाद!
मार्सेलो नोगुति

5
"android.R.attr.actionBarSize" एंड्रॉइड वर्जन 2.3 में काम नहीं कर रहा है, लेकिन "R.attr.actionBarSize" एंड्रॉइड सभी वर्जन पर काम कर रहा है। बस "android..rr.actionBarSize" के बजाय "R.attr.actionBarSize", "android.support.v7.appcompat.R.attr.actionBarSize" और आदि का उपयोग करें
नेटालिएल जॉब्स

147

XML में, आपको इस विशेषता का उपयोग करना चाहिए:

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

20
यदि आप ActionBarCompat "@ dimen / abc_action_bar_default_height" का उपयोग कर रहे हैं
अली अल्नोआमी

10
धन्यवाद अली अलनोमी! AppCompat v21 के साथ नाम बदल गया है: "@ dimen / abc_action_bar_default_height_material"
टोनी Ceralva

5
जैसा कि नीचे उल्लेख किया गया है, appcompat के लिए @muzikant, यदि आप इसे कोड में उपयोग करना चाहते हैं, तो सही विशेषता है android.support.v7.appcompat.R.attr.actionBarSize। आप लेआउट एक्सएमएल में इसका उपयोग करना चाहते हैं, android:paddingTop="?attr/actionBarSize"। हर जगह ठीक काम करता है।
रपटबी '

1
जब आप कस्टम XML framelayout का उपयोग कर रहे हैं तो यह समाधान अद्भुत है।
ट्रिप

2
यदि मैं इस attr का उपयोग करना चाहता हूँ लेकिन ऋणात्मक गद्दी के साथ इसका उपयोग करना नकारात्मक है। मैं उसे कैसे कर सकता हूँ?
टाइगर डेवलपर

17

ठीक है, मैं चारों ओर घूम रहा था और कई बार इस पोस्ट पर गया था, इसलिए मुझे लगता है कि यह न केवल शर्लक के लिए वर्णित किया जाएगा बल्कि ऐप्पोमैट के लिए भी अच्छा होगा:

AppCompat का उपयोग करते हुए एक्शन बार ऊंचाई

बहुत सुंदर @ वर्णन के अनुरूप आप इसे निम्नलिखित कोड के साथ पा सकते हैं (मैंने संसाधन आईडी बदल दी है):

TypedValue tv = new TypedValue();

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

पूर्व Sandwitch समस्या

मुझे एक्शन बार ऊंचाई की आवश्यकता थी क्योंकि पूर्व ICE_CREAM_SANDWITCH उपकरणों पर मेरा विचार एक्शन बार ओवरलैपिंग था। मैंने एंड्रॉइड सेट करने की कोशिश की: layout_marginTop = "? Android: attr / actionBarSize", android: Layout_marginTop = "? Attr / actionBarSize", कस्टम थीम के साथ ओवरलैप / व्यूबार और यहां तक ​​कि फिक्स्ड एक्शनबार को ओवरलैप करने की स्थापना की, लेकिन कुछ भी काम नहीं किया। यह कैसे देखा:

ओवरलैप की समस्या

दुर्भाग्य से मुझे पता चला है कि ऊपर वर्णित विधि के साथ मुझे केवल आधी ऊंचाई मिलती है (मुझे लगता है कि विकल्प बार जगह नहीं ली गई है) इसलिए पूरी तरह से ठीक करने के लिए मुझे एक्शन बार ऊंचाई को दोगुना करने की आवश्यकता है और सब कुछ ठीक लगता है:

ओवरलैप तय

अगर किसी को बेहतर समाधान पता है (कार्रवाई को दोगुना करने से) तो मुझे खुशी होगी कि मुझे पता चल गया है कि मैं आईओएस विकास से आया हूं और मुझे एंड्रॉइड के अधिकांश सामान बहुत भ्रामक लगते हैं :)

सादर,

hris.to


मैंने टैब का उपयोग करते समय एक ही बात का अनुभव किया। समस्या यह है कि कभी-कभी टैब बनाम नो टैब्स का पता लगाना कठिन होता है, क्योंकि कुछ डिवाइस कुछ स्थितियों में बेस एक्शनबार में टैब को नेत्रहीन रूप से ध्वस्त कर देते हैं। तो जो मेरे लिए काम कर रहा है वह सिर्फ है ActionBar.getHeight()। स्थिति के आधार पर, यह आपके लिए भी काम कर सकता है।
TalkLittle

मुझे समस्या का सामना करना पड़ रहा था क्यूज़ मैं केवल एक्शनबार की ऊंचाई पर विचार कर रहा था, फिर मैंने 'सूचना पट्टी की ऊंचाई' को भी जोड़ा। इसने मेरे लिए अच्छा काम किया।
दरपन

क्या आप फ्रेमलैट का उपयोग करते हैं और करते हैं layout_gravity="center_vertical"? इसे बदलें "bottom"। Android 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());
   }

यदि आप पुराने Android संस्करणों पर रनटाइम त्रुटियों से बचने के लिए "if (Build.VERSION.SDK_INT> = Build.VERSION_CODES.HONEYCOMB) {}" के साथ पहला रैप कर सकते हैं।
मरीना.ईरल

मेरे 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
यदि आप appcompat का उपयोग कर रहे हैं, तो निम्न जोड़ें:else if (true == getTheme().resolveAttribute( android.support.v7.appcompat.R.attr.actionBarSize, tv, true)) { actionBarHeight = TypedValue.complexToDimensionPixelSize( tv.data,getResources().getDisplayMetrics()); }
Muzikant

3
"if (true =="; मुझे लगता है कि आप "true" हटा सकते हैं ... :)
android डेवलपर

हाँ, आप सही कह रहे हैं ... यह सिर्फ स्पष्टता के लिए जोड़ा गया है
मुज़िकांत

आपके कोड से ऐसा लगता है कि अगर वह ABS का उपयोग कर रहा है तो यह कोई मायने नहीं रखता है, HONEYCOMB से ऊपर के सभी संस्करणों में यह android.R.attr.actionBarSize से एक्शनबार की ऊंचाई लेगा। क्या ये सही है ?
AsafK

वैसे भी स्क्रीन के शीर्ष को छुपाने के लिए आधी क्रिया पट्टी निर्दिष्ट करना है? 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];

जहाँ ' mainView ' आपके लेआउट का मूल दृश्य है।

यह विचार मूल रूप से मुख्य दृश्य का Y स्थान प्राप्त करता है क्योंकि यह ActionBar (या टूलबार) के ठीक नीचे स्थित है।


2

एक्शन बार की ऊंचाई लागू थीम के अनुसार भिन्न होती है। यदि आप AppCompatActivity का उपयोग कर रहे हैं तो ऊंचाई सामान्य गतिविधि से अधिकांश मामलों में भिन्न होगी।

यदि आप AppCompatActivity का उपयोग कर रहे हैं तो आपको android..attr.actionBarSize के बजाय R.attr.actionBarSize का उपयोग करना चाहिए

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

Xml में, आप उपयोग कर सकते हैं? Attr / actionBarSize, लेकिन अगर आपको जावा में उस मूल्य तक पहुंच की आवश्यकता है, तो आपको नीचे दिए गए कोड का उपयोग करने की आवश्यकता है:

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

यदि आप Xamarin / C # का उपयोग कर रहे हैं, तो यह वह कोड है जिसकी आप तलाश कर रहे हैं:

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);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.