2015-11-04 3 views
1

У меня есть деятельность с линейным расположением. Он имеет два вида - одну кнопку и один пользовательский вид ниже. Я хочу, чтобы иметь возможность настраивать пользовательскую высоту программно (он будет вычисляться во время запуска с изображения, нарисованного на нем). И я хочу, чтобы кнопка над ним заполнила оставшееся пространство. Как достичь этого? До сих пор у меня есть этот XML-код:Как программно переопределить атрибут высоты XML?

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       xmlns:tools="http://schemas.android.com/tools" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:background="#0099cc" 
       android:orientation="vertical" 
       tools:context="eu.example.app.PianoActivity"> 

    <Button 
     android:id="@+id/dummy_button" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:text="@string/dummy_button"/> 

    <eu.example.app.PianoView 
     android:id="@+id/pianoView" 
     android:layout_width="match_parent" 
     android:layout_height="50dp" 
     android:keepScreenOn="true"/> 

</LinearLayout> 

Как вы можете видеть, что я добавил вес 1, и высоту 0dp к кнопке, так что оно заполняет оставшееся пространство. И так как требуется предоставить некоторую ценность, я дал фиксированный 50dp для пользовательского представления. Теперь я попытался изменить высоту, используя этот код:

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(100, 100); 
this.setLayoutParams(layoutParams); 
this.requestLayout(); 

Но это ничего не делать, независимо от того, где я поставил его - будь то в конструкторах The View или в методе OnDraw().

// EDIT: Дополнительная информация: пользовательский вид наследует непосредственно от просмотра и переопределяет метод только OnDraw(), чтобы сделать некоторые вещи на себя.

+0

Side Примечание: если ваш '' PianoView' расширяет ImageView', вы можете быть в состоянии сделать это полностью в XML. Взгляните на http://stackoverflow.com/a/19316787/996592 для деталей. –

+0

На самом деле, дополнительная информация о PianoView в целом может быть полезна. Можете ли вы опубликовать источник? На что он наследуется? Как это принято? Переопределяет ли он onMeasure() или onLayout()? –

+0

ссылка на эту тему http://stackoverflow.com/questions/15501831/add-layout-with-parameters-programmatically-android – sarath19

ответ

1

Вы должны использовать

public void onWindowFocusChanged(boolean hasFocus) {} 

способ установить высоту и ширину.

0

Поместите идентификатор атрибута Ot вашей линейной компоновки в XML, как: -

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       xmlns:tools="http://schemas.android.com/tools" 
       droid:id="@+id/liLay" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:background="#0099cc" 
       android:orientation="vertical" 
       tools:context="eu.example.app.PianoActivity"> 
<Button ---/> 
<eu.example.app.PianoView---/> 
</LinearLayout> 

Сейчас в вашем методе OnCreate() initialse макете, как: -

LinearLayout liLay = (LinearLayout)findViewById(R.id.liLay); 

и теперь установить раскладку Параметры прогматически,

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(100, 100); 
liLay.setLayoutParams(layoutParams); 

Это поможет вам.

0

Используйте это:

layoutParams.height = 130; 
yourLayout.setLayoutParams(layoutParams); 
Смежные вопросы