Как программно установить высоту и ширину для framelayout в Android
Я хочу установить высоту и ширину для framelayout, если дать значения в Java-коде, используя setlayout, то есть очень маленькое поле, но в XML оно отображается правильно.
Это мой код Java
FrameLayout frameLayout2= (FrameLayout) light.findViewById(R.id.frameLayout2);
ConstraintLayout.LayoutParams lp = new ConstraintLayout.LayoutParams(300, 300);
frameLayout2.setLayoutParams(lp);
это мой xml: Примечание: макет ограничения - мой родитель
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".LightPlaceFragment"
tools:layout_editor_absoluteY="81dp"
tools:layout_editor_absoluteX="0dp"
android:background="@color/colorAccent">
<FrameLayout
android:layout_width="300dp"
android:layout_height="300dp"
android:layout_marginRight="8dp"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintHorizontal_bias="0.882"
android:layout_marginTop="8dp"
app:layout_constraintTop_toBottomOf="@+id/l_width"
app:layout_constraintVertical_bias="0.162"
android:id="@+id/frameLayout2">
<include
android:id="@+id/other"
android:layout_width="300dp"
android:layout_height="200dp"
android:visibility="visible"
layout="@layout/sample1" />
</FrameLayout>
</android.support.constraint.ConstraintLayout>
значения приведены в xml, поэтому он отображается правильно: результат с использованием XML
Значения в данном коде Java, поэтому он показывает очень маленький результат Результат с использованием Java
Как программно изменить ширину и высоту рамки?
Пожалуйста, помогите мне.
4 ответа
Попробуй это
FrameLayout frameLayout2= (FrameLayout) light.findViewById(R.id.frameLayout2);
ConstraintLayout.LayoutParams oldParams = (ConstraintLayout.LayoutParams) frameLayout2.getLayoutParams();
oldParams.width=400;
oldParams.height=500;
frameLayout2.setLayoutParams(oldParams);
Или это
FrameLayout frameLayout2= (FrameLayout) light.findViewById(R.id.frameLayout2);
ConstraintLayout.LayoutParams oldParams= new ConstraintLayout.LayoutParams(300,300);
frameLayout2.setLayoutParams(oldParams);
Произошло и со мной.
Потратив столько времени, я узнал, что программная установка высоты и ширины занимаетPX (pixel)
не в dp, который мы установили вXML
.
Поэтому вам нужно сначала преобразовать размерность в PX из dp, используя коэффициент отображения, подобный этому.
val scale: Float = resources.displayMetrics.density
val resizedInPx = (widthInDp * scale + 0.5f).toInt() // dp to px
ГдеwidthInDp
это желаемый dp, который вы хотите установить как 300
Применение
val params: ViewGroup.LayoutParams = yourlayout.layoutParams
params.width = (widthInDp * scale + 0.5f).toInt() // dp to px
params.height = (heightInDp * scale + 0.5f).toInt() // dp to px
layout!!.setLayoutParams(params)
Использовать этот
FrameLayout frameLayout2= (FrameLayout) light.findViewById(R.id.frameLayout2);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(300, 300);
frameLayout2.setLayoutParams(lp);
(KOTLIN) Если вам нужно обновить только ширину и высоту, вы можете использовать следующий метод:
private fun resizeView(view: View) {
val size = resources.getDimension(R.dimen.view_size).toInt()
view.layoutParams.width = size
view.layoutParams.height = size
//or (but be careful because this will change all the constraints you added in the xml file)
val newLayoutParams = ConstraintLayout.LayoutParams(size, size)
view.layoutParams = newLayoutParams
}