7

Я пытаюсь установить высоту панели инструментов программно таким образом:набор инструментов высота программно Android

toolbar.setLayoutParams(new Toolbar.LayoutParams(LayoutParams.MATCH_PARENT, 42)); 
toolbar.setMinimumHeight(42); 

Но это приводит к неустранимым с этим журнал ->android.widget.relativelayout$layoutparams cannot be cast to android.support.v7.Toolbar$layoutparams

Я также попробовать этот вариант:

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) toolbar.getLayoutParams(); 
params.height = 42; 
toolbar.setLayoutParams(params); 
toolbar.setMinimumHeight(42); 

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

Так что, пожалуйста, помогите мне решить проблему.

ответ

10

Попробуйте это -

RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) mToolbar.getLayoutParams(); 
layoutParams.height = 42; 
mToolbar.setLayoutParams(layoutParams); 

It отлично работает для меня.

Если приведенный выше код еще не работает, попробуйте добавить эту строку в конце -

mToolbar.requestLayout(); 

выше линия заставит вашу панель инструментов, чтобы перемерить все. Возможно, ваш код не работает, потому что вы пытаетесь изменить высоту после раздувания макета. В этом случае вам нужно заставить свой вид пересмотреть все. Взгляните на следующие методы для получения дополнительной информации - requestLayout(), invalidate() и forceLayout(). При изменении LayoutParams на ходу эти три метода подходят, но с большой ценой. Если ваш макет очень тяжелый и имеет много дочерних представлений, вызов любого из этих методов будет влиять на производительность вашего приложения специально на нижних конечных устройствах. Поэтому убедитесь, что вы используете эти методы очень тщательно.

И вы упомянули об аварии, поскольку ваша панель инструментов представляет собой дочерний вид вашего корневого представления, а ваш корневой вид - RelativeLayout. Надеюсь, поможет.

Также, пожалуйста, не следуйте ответам Силамбарасана Поунгути, как его бит двусмысленный. LayoutParams casting необходимо, если вы пытаетесь получить доступ к макетам LayoutParams. Даже View имеет свои собственные LayoutParams, вам нужно отдать его родительскому или корневому LayoutParams для ex. если ваша панель представляет собой вид ребенка из RelativeLayout затем литья LayoutParams к Toolbar.LayoutParams будет разбить приложение, и вы должны отливать LayoutParams к RelativeLayout.LayoutParams

+0

спасибо за очень точный ответ, он работает. – Veka

+0

Рад, что это помогло. – Varundroid

+0

Я добавил немного больше объяснений о том, как все работает с точки зрения Views в Android. Надеюсь, вы найдете это полезным. – Varundroid

1

Попробуйте это ...

панель имеет собственный LayoutParams. вы не можете отдать его RelativeLayout.

Toolbar.LayoutParams params = (Toolbar.LayoutParams)mToolbar.getLayoutParams(); 
    params.height = 42; 
    mToolbar.setLayoutParams(params); 

Если вы хотите установить высоту панели инструментов во время выполнения просто сделать так,

int expected_height = your value; 
    mToolbar.setMinimumHeight(expected_height); 

Счастливый кодирования ...

+0

Спасибо за ответ, я тоже пробовал этот код, но он дает то же исключение.Также setMinimumHeight даже не существует, поскольку в случае минимальной минимальной высоты он получает минимальную высоту по умолчанию для панели инструментов – Veka

+0

Это не то, как работает LayoutParams. Даже View имеет свои собственные LayoutParams, вам нужно отдать его родительскому или корневому LayoutParams для ex. если ваша панель инструментов представляет собой дочерний вид RelativeLayout, а затем литье LayoutParams на панель инструментов. LayoutParams приведет к сбою приложения, и вам нужно отбросить LayoutParams в RelativeLayout.LayoutParams – Varundroid

0

Чтобы избежать ошибки, вам нужно использовать ViewGroup.LayoutParams, поскольку android.support.v7.Toolbar работы с ним и возвращает его на mToolbar.getLayoutParams().

Смежные вопросы