我正在尝试使用其中的两个视图布局活动,如下所示。
蓝色视图:此视图始终为方形。它的最大高度是窗口的宽度。如果需要,它可以缩小,但总是保持平方。
绿色视图:此视图具有最小高度,但没有最大值。如果包含的窗口非常高,则此视图的高度将会增加。
有没有人知道在android的xml布局中处理这个问题?我已尝试过layout_weights,但无法让它以两种方式工作(缩小和增长)。
如果有帮助,周围的ViewGroup是一个LinearLayout。
答案 0 :(得分:0)
首先根据dp
获取屏幕宽度的值
Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics outMetrics = new DisplayMetrics ();
display.getMetrics(outMetrics);
float density = getResources().getDisplayMetrics().density;
float dpHeight = outMetrics.heightPixels / density;
float dpWidth = outMetrics.widthPixels / density;

然后将dp中显示宽度的相同值设置为布局的高度
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(dpHeight, dpHeight);

无论设备屏幕如何,您都将拥有乡绅布局
这是实现布局最小高度的方法
SmartImageView siv = new SmartImageView(getActivity());
LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, minHeight);
siv.setLayoutParams(params);

答案 1 :(得分:0)
根据我收到的评论,我最终做了以下操作(针对我的解决方案稍作自定义,但包括代码,以防其他人帮助)。
在layout.xml中
<LinearLayout
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<RelativeLayout
android:id="@+id/blueWrapper"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<android.support.constraint.ConstraintLayout
android:id="@+id/blueSquare"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<View
android:adjustViewBounds="true"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="@id/blueSquare"
app:layout_constraintLeft_toLeftOf="@id/blueSquare"
app:layout_constraintRight_toRightOf="@id/blueSquare"
app:layout_constraintTop_toTopOf="@id/blueSquare"
app:layout_constraintDimensionRatio="w,1:1"/>
</android.support.constraint.ConstraintLayout>
<!--EXTRA ELEMENTS HERE-->
</RelativeLayout>
<!-- 100dp is the minHeight -->
<RelativeLayout
android:id="@+id/greenWrapper"
android:layout_width="match_parent"
android:layout_height="100dp"
android:background="@color/green" >
<!--ELEMENTS HERE-->
</RelativeLayout>
</LinearLayout>
在我的活动中:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_activity);
// Other initialization stuff here
final LinearLayout root = (LinearLayout) findViewById(R.id.root);
final RelativeLayout blueWrapper = (RelativeLayout) findViewById(R.id.blueWrapper);
final View blueSquare = (View) findViewById(R.id.blueSquare);
final RelativeLayout greenWrapper = (RelativeLayout) findViewById(R.id.greenWrapper);
ViewTreeObserver vto = root.getViewTreeObserver();
vto.addOnGlobalLayoutListener (new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
root.getViewTreeObserver().removeOnGlobalLayoutListener(this);
int rootHeight = root.getHeight();
if(blueWrapper.getHeight() > blueWrapper.getWidth()){
ViewGroup.LayoutParams layoutParams = greenWrapper.getLayoutParams();
layoutParams.height = rootHeight - blueSquare.getWidth();
greenWrapper.setLayoutParams(layoutParams);
}
}
});
}
这背后的逻辑是:
在加载时,一切都会按预期工作,除非它是高大的窗户。
对于高大的窗户,蓝色会拉伸到高度比宽度更大,便于识别。
当发生这种情况时,只需计算blueHeight&amp; blueWidth&amp;将其添加到绿色包装的原始高度。