Изменение динамической ширины и высоты размещения
Привет, я использую следующую структуру раскладки внутри 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 файла, а не устанавливать его на 320 пикселей в XML файле, но не в состоянии сделать это. Изменение ориентации не является проблемой, поскольку я ограничиваю его только в режиме Portrait. Можно установить относительный макет в полноэкранном режиме с помощью match_parent, но я должен поместить другие виды на экран, так что это возможно, или я должен достичь этого по-другому...
Ответы
Ответ 1
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
Наслаждайтесь!
Ответ 2
попробуйте использовать
getLayoutParams().height= x;
requestLayout(); or invalidate();
Ответ 3
укажите идентификатор вашего относительного расположения в .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);
Ответ 4
Из кода ниже u можно получить высоту и ширину устройства: -
Display display = getWindowManager().getDefaultDisplay();
int width = (display.getWidth() );
int height = (display.getHeight() );
paramsTop ur realative layout: -
Теперь вы можете установить высоту или ширину, что вы хотите.
paramsTop = new RelativeLayout.LayoutParams(width, height);
Ответ 5
Динамические размеры представлений можно задать с помощью 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;
Ответ 6
Я столкнулся с этой проблемой, лучшим решением для изменения относительной ширины и высоты размещения динамически, как это
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);
Ответ 7
Если вы намереваетесь изменить "Высота", это сделает трюк.
RelativeLayout relativeLayout = (RelativeLayout) findViewById(R.id.yourId);
relativeLayout.getLayoutParams().height = 100;
relativeLayout.getLayoutParams().width = 100;