ActionBar yüksekliği nasıl elde edilir?


190

ActionBarBir etkinlik (özellikle ActionBar yüksekliği değişebilir rotasyonda yapılandırma değişiklikleri işlemek için) her oluşturulduğunda (Sherlock kullanarak) yüksekliğini almaya çalışıyorum .

Bunun için ActionBar.getHeight()sadece ActionBargösterildiği zaman çalışan yöntemi kullanıyorum .

İlk etkinlik ilk kez oluşturulduğunda getHeight(), onCreateOptionsMenugeri aramayı arayabilirim . Ancak bu yönteme daha sonra çağrılmaz.

Benim sorum şu anda getHeight () öğesini ne zaman arayabilirim ve 0 döndürmediğinden emin olabilir miyim? Veya mümkün değilse, ActionBar'ın yüksekliğini nasıl ayarlayabilirim?

Yanıtlar:


419

ActionBar boyutunu açıkça denetlemek istiyorsanız @ birdy'nin yanıtı bir seçenek olsa da, destek belgelerinde bulduğum boyutu kilitlemeden yukarı çekmenin bir yolu vardır. Biraz garip ama benim için çalıştı. Bir bağlama ihtiyacınız olacak, bu örnek bir Etkinlikte geçerli olacaktır.

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

Kotlin :

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

13
çok yardım !! ama tüm bu tür şeyleri bulduğunuz yerden !!
Vikky

5
Genel olarak, geliştirici el kitabı aracılığıyla kapsamlı Google'dan veya drudging'den. Bence bu durumda ikincisi, ama bir süre oldu.
Anthony

1
İşlem çubuğu boyutunu yalnızca belirli bir etkinlik için değiştirebilir miyiz?
Sudarshan Bhat

Bu benim için her iki durumda da çalıştı: (i) onCreateView ve (ii) onConfigurationChanged. Teşekkürler!
Marcelo Noguti

5
"android.R.attr.actionBarSize" android 2.3 sürümünde çalışmıyor, ancak "R.attr.actionBarSize" android tüm sürümü çalışıyor. "android.R.attr.actionBarSize", "android.support.v7.appcompat.R.attr.actionBarSize" vb. yerine "R.attr.actionBarSize" kullanın.
Nathaniel Jobs

148

XML'de bu özelliği kullanmalısınız:

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

20
ActionBarCompat "@ dimen / abc_action_bar_default_height" kullanıyorsanız
Ali AlNoaimi

10
Teşekkürler Ali AlNoaimi! AppCompat v21 ile isim şu şekilde değiştirildi: "@ dimen / abc_action_bar_default_height_material"
Tony Ceralva

5
@Muzikant'ın belirttiği gibi, appcompat için, kodda kullanmak istiyorsanız, doğru özelliktir android.support.v7.appcompat.R.attr.actionBarSize. Xml düzeninde kullanmak istiyorsanız android:paddingTop="?attr/actionBarSize",. Her yerde iyi çalışıyor.
rpattabi

1
Özel bir XML çerçeve düzeni kullandığınızda bu çözüm harikadır.
tryp

2
Ben bu attr kullanmak istiyorum ama negatif bir dolgu ile kullanmak için negatif. Bunu nasıl yapabilirim?
Tiger geliştiricisi

17

Tamam ben googling oldu ve bu yazı birkaç kez olsun, bu yüzden sadece Sherlock için değil, aynı zamanda appcompat için de açıklamak iyi olacağını düşünüyorum:

AppCompat kullanarak İşlem Çubuğu yüksekliği

@Anthony açıklamasına oldukça benzer, aşağıdaki kodla bulabilirsiniz (Kaynak kimliğini değiştirdim):

TypedValue tv = new TypedValue();

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

Sandwitch Öncesi Sorun

ICE_CREAM_SANDWITCH öncesi cihazlarda benim görüşüm örtüşen eylem çubuğuydu çünkü işlem çubuğunun yüksekliğine ihtiyacım vardı. Ben android: layout_marginTop = "? Android: attr / actionBarSize", android: layout_marginTop = "? Attr / actionBarSize" ayarlamayı denedim, özel tema ile örtüşmeyi ayarladım ve hatta hiçbir şey işe yaramadı. İşte böyle görünüyordu:

çakışma sorunu

Ne yazık ki yukarıda açıklanan yöntem ile yüksekliğinin sadece yarısını aldım (seçenekler çubuğunun yerinde alınmadığını varsayalım), bu yüzden tamamen sorunu düzeltmek için çift eylem çubuğu yüksekliğine ihtiyacım var ve her şey yolunda görünüyor:

üst üste binme düzeltildi

Birisi daha iyi bir çözüm biliyorsa (actionBarHeight'ı ikiye katlamaktan ziyade) iOS geliştirmesinden geldiğimde bana bildirmekten memnuniyet duyarım ve Android görünümünün çoğunun oldukça kafa karıştırıcı olduğunu gördüm :)

Saygılarımızla,

hris.to


Sekmeleri kullanırken de aynı şeyi yaşadım. Bazı aygıtlar, bazı durumlarda sekmeleri görsel olarak temel ActionBar'a daralttığından, bazen sekmeleri ve sekmeleri algılamak zor olabilir. Benim için işe yarayan şey sadece ActionBar.getHeight(). Duruma bağlı olarak, bu sizin için de işe yarayabilir.
TalkLittle

Sorunla karşı karşıyaydım çünkü sadece eylem çubuğunun yüksekliğini düşünüyordum, sonra 'bildirim çubuğunun' yüksekliğini de ekledim. Benim için iyi çalıştı.
Darpan

FrameLayout kullanıyor musunuz layout_gravity="center_vertical"? Olarak değiştirin "bottom". Android 2.3, yeni Android'lerden farklı olarak FrameLaoyut'taki marjları ele alıyor.
Oliv

16

@Anthony yanıtı destekleyen ActionBarcihazlar ve yalnızca Sherlock Action Baraşağıdaki yöntemi destekleyen cihazlar için çalışır

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

Daha eski Android sürümlerinde çalışma zamanı hatalarını önlemek için "if (Build.VERSION.SDK_INT> = Build.VERSION_CODES.HONEYCOMB) {}" ile ilk ifadeyi kapatabilirsiniz.
Marina.Eariel

Benim com.actionbarsherlock.R.attr.actionBarSizeiçin hem Android 2.3 hem de 4.0 için çalıştı, bu yüzden Android sürümü ne olursa olsun bunu kullanabilirsiniz gibi görünüyor.
Felix

13

en güvenli yol olacağını düşünüyorum:

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 kullanıyorsanız, aşağıdakileri ekleyin: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 =="? Bence "true" kaldırabilirsiniz ... :)
android geliştirici

Evet, haklısın ... bu sadece netlik için eklendi
Muzikant

Kodunuzdan, im ABS kullanmanın önemi yok gibi görünüyor, HONEYCOMB üzerindeki tüm sürümlerde, actionbar yüksekliğini android.R.attr.actionBarSize'den alacak. Bu doğru mu ?
AsafK

ekranın üst kısmını gizlemek için yarım eylem çubuğunu belirtmek yine de var mı? stackoverflow.com/questions/27163374/…
Steve

6

Yüksekliğini ayarlamak için bunun gibi ActionBaryeni Themebir tane oluşturabilirsiniz :

<?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>

ve bunu şu Themeşekilde ayarlayın Activity:

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

1
Yatay modda eylem çubuğunun yüksekliğinin daha küçük olduğuna dikkat edin.
Mark Buikema

ActionBarSherlock, actionbar yüksekliğine karar verirken çok şey hesaba kattığından bunu önermiyorum. Bunu yaparsanız, actionBar yüksekliği cihaz özelliklerine dayanmaz ve bu nedenle belirli cihazlar için standart yükseklik gibi görünmez.
Chris Sprague

5

Java:

    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

ActionBar olarak Araç Çubuğu kullanıyorsanız,

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

araç çubuğunun layout_height değerini kullanın.

int actionBarHeight = toolbar.getLayoutParams().height;

3

işlem çubuğunun yüksekliğini almak için bu işlevi kullanabilirsiniz.

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

Bu yardımcı yöntem birisi için kullanışlı olmalıdır. Misal: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

sadece bunu eklemelisin.

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

Onu keşfetmenin daha genel bir yolunu buldum:

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

burada ' mainView ', düzeninizin kök görünümüdür.

Fikir temel olarak, ActionView öğesinin (veya Araç Çubuğunun) hemen altında ayarlandığı için mainView öğesinin Y konumunu almaktır .


2

İşlem çubuğu yüksekliği uygulanan temaya göre değişir. AppCompatActivity kullanıyorsanız yükseklik çoğu durumda normal Aktiviteden farklı olacaktır.

Eğer kullanıyorsanız AppCompatActivity Eğer R.attr.actionBarSize yerine android.R.attr.actionBarSize kullanmalıdı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

Xml'de? Attr / actionBarSize kullanabilirsiniz, ancak Java'da bu değere erişmeniz gerekiyorsa aşağıdaki kodu kullanmanız gerekir:

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

En popüler yanıtı yerine getirmek için hazır bir yöntem:

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

İşte telefon Petek daha yüksek olduğunu varsayalım Kotlin ile güncellenmiş bir sürümü:

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

1

Xamarin / C # kullanıyorsanız, aradığınız kod budur:

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

İşlem çubuğu yüksekliğini bulmanın basit bir yolu Etkinlik onPrepareOptionMenuyöntemidir.

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

0

Javafx'te (Gluon kullanarak) yükseklik çalışma zamanında veya buna benzer bir şekilde ayarlanır. Genişliği normal gibi elde ederken ...

double width = appBar.getWidth();

Bir dinleyici oluşturmanız gerekir:

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

... Ve değiştiği en son değeri al. Yüksekliği elde etmek için.


0

Dışarıda olan her şeyi başarılı olmadan denedikten sonra, yanlışlıkla eylem çubuğunun varsayılan yüksekliğini elde etmenin işlevsel ve çok kolay bir yolunu buldum.

Yalnızca API 25 ve 24'te test edildi

C #

Resources.GetDimensionPixelSize(Resource.Dimension.abc_action_bar_default_height_material); 

Java

getResources().getDimensionPixelSize(R.dimen.abc_action_bar_default_height_material);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.