5

У меня странная проблема с вычислением высоты ActionBar. У меня есть пара частей в моем приложении, где что-то расположено прямо ниже ActionBar, и я также пользуюсь библиотекой Криса Банеса actionbar-pulltorefresh.Android ActionBar height issue

Я воспользуюсь примером из приложения для обновления библиотеки. Я испытываю то же самое, что и вопрос here, за исключением того, что я делаю все, как именно руководство говорит с Fragments. Он в основном вычисляет высоту ActionBar примерно половину того, что должно быть. Также в другой части приложения я позиционирую PopupWindow ниже ActionBar, поэтому я вызываю getHeight() и использую эту позицию для своего окна. Я получаю ту же проблему, что и при попытке обновить библиотеку.

Так что это заставляет меня думать, что это связано с тем, как измеряется высота ActionBar, и это может быть проблема стиля.

Но здесь, где это становится интересным. Если я поворачиваю устройства в ландшафтном режиме, он точно определяет высоту и помещает все, что должно быть с этой точки, даже если я повернусь назад к портрету. он внезапно фиксируется, пока я не перезапущу приложение и не убью его из памяти и не начну снова.

У кого-нибудь было что-то подобное?

ПРИМЕЧАНИЕ. Я использую библиотеку appcompat сейчас, но раньше я использовал ActionBarSherlock, а также базовый ActionBar, и все сценарии дали тот же результат.

UPDATE 1: я получаю те же результаты от проблем here, here и here. Однако я делаю все, о чем говорит README, поэтому я уверен, что это связано с тем, как мое устройство измеряет высоту ActionBar.

UPDATE 2: Я использовал ActionBar PullToRefresh библиотеку в другой деятельности, и она отлично работает, так что это должно быть что-то делать с моей основной Activity.

+0

Вопрос в том, когда вы вызываете 'getHeight()'? Как Pull для обновления библиотеки вызывает это, в определенное время. т.е. когда создается «Просмотр». на боковой ноте вы используете «просмотр пейджера»? –

+0

Я использую 'ViewPager' в некоторых« Фрагментах », но проблема существует повсюду внутри родительского« Активность ». – Wenger

+0

Я вызываю 'getHeight()' как одну из первых вещей в моей 'Деятельности'' onCreate() '. – Wenger

ответ

4

Я называю getHeight() как одну из первых вещей в моей деятельности onCreate().

Это то, что возвращает неправильную высоту, скорее всего, 0. ActionBar не готов предоставить вам информацию о себе в этот момент. Он находится в процессе создания, а также остальной вид деятельности.

Попробуйте следующее:

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

    // Don't call setContentView(int) 

    // Inflate the layout file that 
    // you would have used with setContentView(R.layout.xml_file) 
    View mContentView = getLayoutInflater().inflate(R.layout.xml_file, null); 

    // Add this Runnbale to mContentView's message queue 
    mContentView.post(new Runnable() { 

     @Override 
     public void run() { 
      Toast.makeText(Your_Activity.this, "ActionBar's height is " + 
         getActionBar().getHeight(), Toast.LENGTH_LONG).show(); 
     } 

    }); 

    // Initialize widgets contained in R.layout.xml_file 

    // Example 
    Button b = (Button) mContentView.findViewById(R.id.button_id); 

    ....   

    setContentview(mContentView); 
} 

Это должно дать вам правильное значение высоты ActionBar в.

В качестве доказательства концепции прокомментируйте mContentView.post(...); и просто покажите тост. Тост, скорее всего, скажет ActionBar's height is 0.

+0

Спасибо, я дам это сегодня вечером. Даже если я не буду называть 'getHeight()' в моем коде где угодно, библиотека PullToRefresh по-прежнему дает мне результаты из ссылок. – Wenger

14

Чтобы убедиться, что в вашей панели действий нет объектов, вы можете добавить к ним верхний маркер в XML.

<SomeView 
    ... 
    android:layout_marginTop="?android:attr/actionBarSize" /> 

Источник: http://developer.android.com/guide/topics/ui/actionbar.html#Style

UPDATE: Ниже добавлен. Я решил погрузиться в исходный код Android, чтобы увидеть, каковы фактические высоты ActionBar. Итак, я просмотрел все типы значений/dimens.xml, чтобы найти action_bar_default_height. Ниже приведены выводы.

В values/dimens.xml,

<!-- Default height of an action bar. --> 
<dimen name="action_bar_default_height">48dip</dimen> 

В values-land/dimens.xml,

<!-- Default height of an action bar. --> 
<dimen name="action_bar_default_height">40dip</dimen> 

В values-sw600dp/dimens.xml,

<!-- Default height of an action bar. --> 
<dimen name="action_bar_default_height">56dip</dimen> 

Я также проверил следующее, но они не заменяют этого атрибута:

values-large 
values-sw380dp 
values-sw600dp-land 
values-sw720dp 
values-w360dp 
values-w600dp 
values-w720dp 
values-xlarge 

Когда я получаю больше времени, я могу найти корень проблемы, но до тех пор вы можете добавить эти три значения в свои папки с различными значениями (как временное исправление).

+0

Кажется, что проблема в actionBarSize возвращает неправильное значение. Это примерно половина того, что должно быть. – Wenger

+0

Хорошо. Теперь вот первый ответ, который я собирался подавить (но не смог найти источник): я помню где-то в документах Android, что он сказал, что ActionBar имеет 50dp высотой в портрете и 44dp высок в ландшафте (устройство для смартфонов). Но вскоре я уточню свой ответ. – Anonsage

+0

Спасибо. Это должно работать как бандажная помощь, и если это лучшее, что я могу сделать, то, думаю, это должно сработать. – Wenger