Я пытаюсь установить ширину макета на "fill_parent", имея высоту представления той же длины, чтобы сделать макет квадратом.
Любые предложения будут оценены, спасибо заранее!: D
Я пытаюсь установить ширину макета на "fill_parent", имея высоту представления той же длины, чтобы сделать макет квадратом.
Любые предложения будут оценены, спасибо заранее!: D
С введением ConstraintLayout вам не нужно писать ни одну строку кода, ни использовать сторонние пользователи или полагаться на PercentFrameLayout
которые устарели в 26.0.0.
Вот пример того, как сохранить соотношение сторон 1:1 для вашего макета с помощью ConstraintLayout
:
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginEnd="0dp"
android:layout_marginStart="0dp"
android:layout_marginTop="0dp"
android:background="@android:color/black"
app:layout_constraintDimensionRatio="H,1:1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
</FrameLayout>
</android.support.constraint.ConstraintLayout>
Или вместо редактирования вашего XML файла вы можете отредактировать макет непосредственно в редакторе макетов:
В файле build.gradle добавьте:
compile 'com.android.support:percent:23.1.1'
а в вашем layout.xml wrap любой вид или группу просмотра вы хотите следовать соотношению внутри PercentFrameLayout, где:
android:layout_width="match_parent"
android:layout_height="wrap_content"
а затем для группы просмотра или просмотра вы хотите следовать соотношению заменить android: layout_width и android: layout_height:
app:layout_aspectRatio="178%"
app:layout_widthPercent="100%"
и у вас есть группа просмотра или просмотра, где соотношение сторон составляет 16: 9 (1.78: 1) с шириной, соответствующей родительской и соответствующей высоте.
Примечание. Важно удалить обычные свойства ширины и высоты. Линт будет жаловаться, но он будет работать.
Сначала вы можете попробовать установить layout_height
на wrap_content
. Но оттуда я думаю, что вам нужно идти в код. Просто экспериментируйте, в своей деятельности попробуйте что-то вроде:
@Override
public void onResume(){
super.onResume();
findViewById(R.id.squareView).getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override public void onGlobalLayout() {
View squareView = findViewById(R.id.squareView);
LayoutParams layout = squareView.getLayoutParams();
layout.height = squareView.getWidth();
squareView.setLayoutParams(layout);
squareView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
});
}
Где R.id.squareView
- id
рассматриваемого вида. Обратите внимание: этот код завернут в вызов onGlobalLayout
, чтобы гарантировать, что squareView.getWidth()
имеет значимое значение.
Я создал библиотеку макетов для аналогичного варианта использования. Не стесняйтесь использовать его.
Добавьте это в начало файла
repositories {
maven {
url "http://dl.bintray.com/riteshakya037/maven"
}
}
dependencies {
compile 'com.ritesh:ratiolayout:1.0.0'
}
Определить пространство имен приложения в корневом представлении в вашем макете
xmlns:app="http://schemas.android.com/apk/res-auto"
Включите эту библиотеку в макет
<com.ritesh.ratiolayout.RatioRelativeLayout
android:id="@+id/activity_main_ratio_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:fixed_attribute="WIDTH" // Fix one side of the layout
app:horizontal_ratio="2" // ratio of 2:3
app:vertical_ratio="3">
LinearLayout ll = (LinearLayout)findViewById(R.id.LL);
int width = ll.getWidth();
LinearLayout.LayoutParams ll_params = new LinearLayout.LayoutParams(width, width);
ll.setLayoutParams(ll_params);
установите высоту как fill_parent
, ширина как wrap_content
и вы фиксируете соотношение сторон с android:adjustViewBounds="true"