TL; DR:以下是与我所面临的问题相关的所有内容的要点:[GIST LINK]
这是问题的图片
我正在尝试设置多个按钮,这些按钮在垂直放置的LinearLayout
容器中通过相等的权重将彼此增长到相同的大小。
当这些按钮上的文本导致每个按钮的行数不同时,我面临着表面问题。
假设n
是按钮的最低行数,m
是按钮的最高行数;带有行数m
的按钮文本中的所有下降符号都将被切除。请参考链接的屏幕截图中的"qshowing my clipping problem"
一词,其中所有后代均被切除。
我该如何解决这个问题?如果将android:lineSpacingExtra
引入按钮样式,则裁剪会变得更糟。
如果相关,我的最低API设置为21
答案 0 :(得分:0)
我已经使用RxJava修复了此问题,以编程方式将高度设置为正确的最大值,这样就不会发生裁剪。如果有更好的解决方案,我将很高兴看到它,但这是目前对我有用的方法:
class MyActivity {
// ...
private val compositeDisposable = CompositeDisposable()
override fun onCreate(savedInstanceState: Bundle?) {
setContentView(R.layout.my_activity)
// ...
val container: LinearLayout = findViewById(R.id.container)
val numBtns = getNumBtnsToAdd()
val btnList: MutableList<Button> = mutableListOf()
val margin10 = dpToPx(10f).toInt()
val countDown = CountDownLatch(numBtns)
val desiredLp = LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0).apply {
gravity = Gravity.CENTER
setMargins(margin10, margin10, margin10, margin10)
}
// Completable will be run once per subscriber and emit a success or error
val layoutCompletable = Completable.fromAction {
countDown.await()
for (btn in btnList) btn.layoutParams = desiredLp
}.subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread())
compositeDisposable.add(
layoutCompletable.subscribe({
Log.d("MyActivity", "Set LayoutParams on all buttons.")
}, Throwable::printStackTrace)
)
for (i in 0 until numBtns) {
val btn = Button(this, null, 0, R.style.button_style).apply {
layoutParams = LinearLayout.LayoutParams(desiredLp).apply { height = LinearLayout.LayoutParams.WRAP_CONTENTS }
text = if (i == 0) "Button${i+1} with short text"
else "Button${i+1} with text that will span multiple lines showing my clipping problem"
setOnClickListener { doSomething() }
}
val listener = object : ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
countDown.countDown()
val height = btn.height
if (height > desiredLp.height) desiredLp.height = height
btn.viewTreeObserver.removeOnGlobalLayoutListener(this)
}
}
btn.viewTreeObserver.addOnGlobalLayoutListener(listener)
btnList.add(btn)
container.addView(btn)
}
// ...
}
override fun finish() {
compositeDisposable.clear()
super.finish()
}
// ...
}
答案 1 :(得分:0)
我的猜测是,主要原因是按钮的尺寸固定。更珍贵的是,您使用LinearLayout
属性通过weight
在按钮之间共享可用空间。您可以看到单行按钮的高度与两行按钮的高度相同。因此,两行按钮被迫剪切文本。
根据您的XML文件,要在没有更多空间时启用垂直滚动。在这种情况下,您不需要使用weight
属性。只需在彼此之间留有边距即可。