gpt4 book ai didi

java - Android:自定义对话框的大小不准确

转载 作者:行者123 更新时间:2023-12-02 08:43:25 25 4
gpt4 key购买 nike

我正在尝试为我的应用程序创建一个自定义对话框视图。
运行该程序时,结果与我预期的相差很大。

XML档案:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@color/colorPrimaryDark">

<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="200dp"
android:background="@color/colorAccent">
</LinearLayout>

<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimary">

<Button
android:id="@+id/button10"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button" />
</LinearLayout>
</LinearLayout>


java类:

public class SinglePSettings extends AppCompatDialogFragment {
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
LayoutInflater inflater = getActivity().getLayoutInflater();

View view = inflater.inflate(R.layout.layout_singlepsettings, null);
builder.setView(view)
.setTitle("Settings");

return builder.create();
}
public void onResume()
{
super.onResume();
Window window = getDialog().getWindow();
Point size = new Point();
Display display = window.getWindowManager().getDefaultDisplay();
display.getSize(size);
int width = (int)(size.x * 0.90);
int height = (int)(size.y * 0.90);
window.setLayout(width, height);
window.setGravity(Gravity.CENTER);
}


Expectation and result

我不完全理解为什么主要的LinearLayout是“不可见的”。似乎里面的物品也不依赖于它。有什么方法可以用布局填充整个对话框块吗? (当然,以后我可以进一步自定义)

最佳答案

这是因为对话框的根目录布局高度为match_parent,第一个子元素Linearlayout的内容总大小为200dp +第二个子元素Linearlayout的内容总大小为〜24dp,该大小小于对话框的总大小。

您应该将父LinearLayout的高度更改为wrap_content或将android:weight=1添加到任何子LinearLayouts



更新:让我尝试解释线性布局如何工作。请注意,这些都是基于经验,您应该阅读官方文档以更好地理解。

orientation一致的尺寸对于线性布局的子代至关重要。因此,如果方向是水平的,则所有子级都将水平堆叠,并且需要控制其width属性。

想象一下水平线性布局是一个家。暂时,假设您必须始终将关键属性在父线性布局中保持为match_parent。因此,我们的线性布局/首页具有width=match_parent。可以通过3种主要方式添加子级:

保持每个孩子为wrap_content


这意味着每个孩子将占用与其自身大小相等的屏幕空间。
如果没有。的项目数较少或屏幕尺寸足够大,此方法有效。
但是,如果它们有很多大物件,则它们所需的总空间=它们所有宽度的总和。如果该总和大于屏幕尺寸,则某些项目将不在屏幕上。
在我们的家庭类比中,就像我们将所有桌子,椅子,床等直线堆叠一样。如果它们占用的空间比2个端壁之间的空间小,则它很大,但是如果它们需要更多的水平空间,则我们必须打破壁来调整它们。
因此,不建议将所有项目都保留为wrap content


enter image description here

保持1个/多个孩子为match_parent


这是一个非常错误的方法。当您将孩子的宽度保持为match_parent时,基本上就是在告诉编译器为该单个视图提供完整的屏幕空间。
而且编译器肯定会这样做。即使它是一个按钮,它也将在整个屏幕上延伸,并且其他视图实际上将不在屏幕上,因此将不可见。
当它们是带有width=match_parent的多个视图时,它将仅将整个屏幕空间分配给从左侧开始的第一个视图。
在我们的家庭类比中,就像您将椅子的width属性更改为match_parent一样,房间神奇地扩展了它以占据完整的空间,因此您的床,桌子等现在都被压在了床的侧面。房间。


enter image description here

为1个或多个孩子保留layout_weight=x


这是在线性布局中使用的最佳方法。我认为这是为视图分配屏幕百分比。
如果您的子视图具有weight=x,则它不受视图crucial attribute中存在的值的影响。这意味着您可以使用width= match_parentwrap_content甚至1000000dp,如果它具有weight=x,则将其渲染为全屏视图。请注意,这里仅讨论关键属性,即本例中的宽度。
知道具有权重的视图将如何影响其他视图也非常有趣。


如果另一个视图具有width = match_parent(并且没有weight属性),则该视图将占用整个屏幕空间,但是这次我们的WITH weight视图将不会被压缩。取而代之的是,这是应该获得的最小空间(即wrap_content或我们为width=x传递的固定值)。
好像我们在椅子上添加了weight属性,在床上添加了match_parent属性。床把所有其他物品都挤掉了,但椅子仍然占据了所需的空间。



enter image description here


当其他项目的关键属性具有wrap_content值(但没有权重属性)时,情况类似。这次,具有权重的视图将占据所有空间,除了其他视图所需的空间(将下面的图像与第一种情况进行比较,并注意圆现在如何占据所有剩余空间而不挤压其他视图)
enter image description here
当每个属性都有权重时,这将成为一个有趣的百分比游戏。如果我们有2个项目,并且每个项目都有layout_weight=1,则无论它们的宽度如何,两者都将占用50%的空间。如果其中之一具有layout_weight=2,则分布将为2:1,即66%:33%。这使得视图在不同的屏幕尺寸和方向上都具有响应能力


enter image description here



因此,在线性布局中使用子视图的最佳方法是在其关键尺寸属性和wrap_content中包含layout_weight=x。这将使其响应速度更快并且更易于控制。同样,我也没有过多地讨论在关键尺寸属性中设置固定权重,因为它们总是很难处理。不会详细介绍(您可以自己尝试),但最终总是会被挤压或挤压其他视图

关于java - Android:自定义对话框的大小不准确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61239962/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com