2013-03-15 3 views
14

Привет я использую следующую структуру макета внутри LinearLayoutИзменение относительной ширины макета и высоту динамически

<TableLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" > 

    <TableRow 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" > 
    </TableRow> 

    <TableRow 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" > 

     <TextView 
      android:id="@+id/tv1" 
      android:layout_height="wrap_content" 
      android:gravity="left" 
      android:paddingLeft="10dp" 
      android:textColor="#000" /> 

     <TextView 
      android:id="@+id/tv2" 
      android:layout_height="wrap_content" 
      android:layout_weight="1.0" 
      android:gravity="right" 
      android:paddingRight="10dp" 
      android:textColor="#000" /> 
    </TableRow> 
</TableLayout> 

<ImageView 
    android:id="@+id/img1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" /> 

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="320px" 
    android:layout_height="320px" 
    android:gravity="center" > 
</RelativeLayout> 

и хотите установить относительную ширину макета и высоту динамически из Java-файла вместо того, чтобы установить его в 320px в файле XML, но Невозможно это сделать, изменение ориентации не является проблемой, так как я ограничиваю его только в портретном режиме. Можно установить относительное расположение на весь экран с помощью match_parent, но я должен поставить еще точку зрения на экране, так это возможно, или я должен достичь это по-другому ...

+0

Чтобы задать ширину макета динамически вам придется расширить класс RelativeLayout из класса, который вы создали и переопределить метод onMeasure – Neil

+0

Спасибо за ответ, я попробовал все, и это дает исключение класса произнесения, когда я пытаюсь для динамической установки ширины и высоты. Относительный макет также содержит другие дочерние элементы в виде изображений, поэтому я воспринимаю его как группу представлений в java-файле, но не могу этого сделать. –

+0

Просьба указать исключение и код, где он указывает на – Neil

ответ

22

Android не обновляется макет просмотров с wrap_content после его отображения. Даже с invalidate() или requestLayout(). Итак, если вы добавляете дочерний вид или динамически изменяете содержимое, вы ввернуты.

getLayoutParams().height = x plus requestLayout() - хорошее решение, если вы знаете «x», и если вам нужно это делать ТОЛЬКО ОДИН РАЗ. После этого wrap_content в LayoutParams потерян, так как вы его переопределили.

Чтобы решить это, я написал статический класс, который пересматривает размеры и заставляет обновлять макет для просмотров с помощью wrap_content. Код и инструкции для использования доступны здесь:

https://github.com/ea167/android-layout-wrap-content-updater

Наслаждайтесь!

+0

Эй, Эрик, у вас есть пример использования для вашего кода? Кажется, я не могу получить доступ к методам из вашего класса ?! – patrics

+0

Вы действительно спасли мою жизнь этим классом. Огромное спасибо. – Namnodorel

+0

Добро пожаловать @Namnodorel! Рад, что это помогло :) – Eric

13

попробовать с помощью этого

getLayoutParams().height= x; 
requestLayout(); or invalidate(); 
2

снизу кода и можно получить высоту устройства и ширину: -

Display display = getWindowManager().getDefaultDisplay(); 
    int width = (display.getWidth()); 
    int height = (display.getHeight()); 

paramsTop ур realative макета: -

Теперь и можно установить высоту или ширину, что вы хотите.

 paramsTop = new RelativeLayout.LayoutParams(width, height); 
+0

Это устаревший код. Пожалуйста, обратитесь к следующей теме для не устаревшего кода: http://stackoverflow.com/questions/4743116/get-screen-width-and-height – Simon

2

Динамические размеры представлений можно изменять с помощью LayoutParams. Что-то вроде этого:

RelativeLayout layout = (RelativeLayout) findViewById(R.id.yourlayout_id); 
// Gets the layout params that will allow you to resize the layout 
LayoutParams params = layout.getLayoutParams(); 
params.height = 320; 
params.width = 320; 
5

дает идентификатор для вашего относительного макета в .xml:

android:id="@+id/relativelayout" 

теперь в вашем файле Java написать это:

RelativeLayout Rl = (RelativeLayout) findViewById(R.id.relativelayout); 

RelativeLayout.LayoutParams layout_description = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT or YourUserDefinedwidth, 
         RelativeLayout.LayoutParams.FILL_PARENT or YourUserDefinedHeight); 

Rl.setLayoutParams(layout_description); 
2

Я столкнулся с этой проблемой, лучшим решением для Относительного изменения ширины макета и высоты динамически, как этого

RelativeLayout relMain = (RelativeLayout) convertView.findViewById(R.id.relMain); 
    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
    params.width =200; 
params.height =200; 
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); 
     relMain.setLayoutParams(params); 
+0

Его работа для меня :) –

0

Если вы намерены изменить высоту, то это будет сделать трюк.

RelativeLayout relativeLayout = (RelativeLayout) findViewById(R.id.yourId); 
relativeLayout.getLayoutParams().height = 100; 
relativeLayout.getLayoutParams().width = 100; 
Смежные вопросы