Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么赢了';我的布局参数不能更改我的布局吗?_Android_Kotlin_Android View_Layoutparams - Fatal编程技术网

Android 为什么赢了';我的布局参数不能更改我的布局吗?

Android 为什么赢了';我的布局参数不能更改我的布局吗?,android,kotlin,android-view,layoutparams,Android,Kotlin,Android View,Layoutparams,我想在编辑文本旁边显示一个带有建议条目的框。 我想我必须设置LayoutParams(如中建议的) 然而,不管我怎么做,盒子总是在左上角结束 我尝试的是: -获取LayoutParams作为MarginLayoutParams(它们是),并对它们进行设置。将它们设置回视图中,以便更好地测量。 -以上链接中的所有答案 使用TranslationX和-Y更改位置(这可以工作,但会遇到其他问题,例如状态栏可能不总是24dp,并且似乎是一个黑客) 函数视图.Setmargins如下所示: fun V

我想在编辑文本旁边显示一个带有建议条目的框。 我想我必须设置LayoutParams(如中建议的)

然而,不管我怎么做,盒子总是在左上角结束

我尝试的是: -获取LayoutParams作为MarginLayoutParams(它们是),并对它们进行设置。将它们设置回视图中,以便更好地测量。 -以上链接中的所有答案

  • 使用TranslationX和-Y更改位置(这可以工作,但会遇到其他问题,例如状态栏可能不总是24dp,并且似乎是一个黑客)
函数视图.Setmargins如下所示:

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
,因为我不知道它,所以我没有使用它:)。另外:我不太清楚为什么我不使用
自动完成文本视图
。非常感谢你的帮助!