Android 为什么赢了';我的布局参数不能更改我的布局吗?
我想在编辑文本旁边显示一个带有建议条目的框。 我想我必须设置LayoutParams(如中建议的) 然而,不管我怎么做,盒子总是在左上角结束 我尝试的是: -获取LayoutParams作为MarginLayoutParams(它们是),并对它们进行设置。将它们设置回视图中,以便更好地测量。 -以上链接中的所有答案Android 为什么赢了';我的布局参数不能更改我的布局吗?,android,kotlin,android-view,layoutparams,Android,Kotlin,Android View,Layoutparams,我想在编辑文本旁边显示一个带有建议条目的框。 我想我必须设置LayoutParams(如中建议的) 然而,不管我怎么做,盒子总是在左上角结束 我尝试的是: -获取LayoutParams作为MarginLayoutParams(它们是),并对它们进行设置。将它们设置回视图中,以便更好地测量。 -以上链接中的所有答案 使用TranslationX和-Y更改位置(这可以工作,但会遇到其他问题,例如状态栏可能不总是24dp,并且似乎是一个黑客) 函数视图.Setmargins如下所示: fun V
- 使用TranslationX和-Y更改位置(这可以工作,但会遇到其他问题,例如状态栏可能不总是24dp,并且似乎是一个黑客)
fun View.setMargins(left: Int, top: Int, right: Int, bottom: Int) {
if (layoutParams is MarginLayoutParams) {
val p = layoutParams as MarginLayoutParams
p.setMargins(left, top, right, bottom)
requestLayout()
}
}
我想做的事情的完整来源(上面的代码片段在第170行,对它进行了一些编辑以显示我尝试过的事情)
我尝试过的其他方法:将
box
添加到不同的布局中,这在任何情况下都会导致框被绘制在该布局的左上角,因为任何人都有与我相同的问题:
Mike M.建议将LayoutParams
设置为ConstraintLayout.LayoutParams
,并将其topToTop
和startToStart
字段设置为ConstraintLayout.LayoutParams.PARENT\u ID
,即
(box?.layoutParams as ConstraintLayout.LayoutParams).apply{
topToTop = ConstraintLayout.LayoutParams.PARENT_ID
startToStart = ConstraintLayout.LayoutParams.PARENT_ID
topMargin = top
marginStart = left
}
对于任何和我有同样问题的人: Mike M.建议将
LayoutParams
设置为ConstraintLayout.LayoutParams
,并将其topToTop
和startToStart
字段设置为ConstraintLayout.LayoutParams.PARENT\u ID
,即
(box?.layoutParams as ConstraintLayout.LayoutParams).apply{
topToTop = ConstraintLayout.LayoutParams.PARENT_ID
startToStart = ConstraintLayout.LayoutParams.PARENT_ID
topMargin = top
marginStart = left
}
父视图组是什么?
EditText
和框的直接子视图都是它的吗?您试图将框相对于EditText
放置在哪里?框是否位于ConstraintLayout
中?您是否以编程方式添加它?如果是,您是否在尝试修改布局之前添加它tparms
?视图默认情况下没有任何LayoutParams
,因此如果在设置任何块之前运行第一个块,将在if
处返回,当您最终添加该框时,它将获得默认的LayoutParams
,这将把它放在左上角。好的,我不使用ConstraintLayout
很多,但我猜边距被忽略了,因为框上没有约束。请尝试将LayoutParams
设置为ConstraintLayout.LayoutParams
,并将其topToTop
和startToStart
字段设置为ConstraintLayout.LayoutParams.PARENT\ID
。另外,我忘了在前面提到,但是你考虑过使用PopupWindow
吗?这可能会更容易一些,而且这是经常做的事情,即使在平台上也是如此;例如,对于Spinner
下拉菜单、上下文菜单等等,是的!还有,我将研究PopupWindow
,我没有研究过使用,因为我不知道:)。另外:我不太清楚为什么我不使用自动完成文本视图
。非常感谢你的帮助!父视图组是什么?EditText
和框是否都是它的直接子项?您试图将框放置在与EditText
相关的确切位置?框是否位于ConstraintLayout
中?你是按程序添加的吗?如果是,是否在尝试修改布局参数之前添加它<代码>视图默认情况下没有任何LayoutParams
,因此如果在设置任何块之前运行第一个块,它将在if
处返回,当您最终添加该框时,它将获得默认的LayoutParams
,这将把它放在左上角。好,我没有太多地使用ConstraintLayout
,但是我猜边距被忽略了,因为框上没有约束。尝试将LayoutParams
设置为ConstraintLayout.LayoutParams
,并将其toptoop
和startToStart
字段设置为ConstraintLayout.LayoutParams.PARENT\u ID
。此外,我忘了前面提到过,但是您是否考虑过为此使用popupindow
?这可能会简单一点,这就是这样做的方式,即使是在平台上;e、 例如,对于Spinner
下拉菜单、上下文菜单等,真是太棒了!此外,我还将研究PopupWindow
,因为我不知道它,所以我没有使用它:)。另外:我不太清楚为什么我不使用自动完成文本视图
。非常感谢你的帮助!