在我的應用程式中,我有一個帶有TextView的覆寫層,它有一個動態的文本大小和內容,可以使用觸摸來移動。我們的目標是使覆寫層的大小與文本的大小相同。對覆寫層使用 WRAP_CONTENT,并不能將包含文本的 LinearLayout 擴展到文本的全部寬度。
該示例將相同的布局作為活動的內容視圖和覆寫層來加載。 使用 MATCH_PARENT,整個 TextView 可以顯示在 Overlay 中,但是這使得 Overlay 無法用于觸摸事件,因為可以觸摸到整個寬度。如果沒有LinearLayout,它也不能擴展到全寬。 對于小于這個最大寬度的寬度,wrap_content 可按預期作業,而對于高度,wrap_content 可按預期對整個設備高度作業,當向文本添加更多行數時,
。我怎樣才能將 TextView 擴展到文本的全部寬度,而不使 TextView 或 LinearLayout 寬于文本?
MainActivity.kt:
class MainActivity : AppCompatActivity(){
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val view = LayoutInflater.from(this).inflate(R。 layout.activity_main, null)
val params = WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT。
WindowManager.LayoutParams.WRAP_CONTENT。
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY。
0,
PixelFormat.TRANSLUCENT。
)
params.gravity = Gravity.START getSystemService(WINDOW_SERVICE) as WindowManager).addView(view,params)
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"? >
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"/span>
android:layout_width="wrap_content"
android:layout_height="wrap_content"。
android:background="#f66">>
<TextView。
android:layout_width="wrap_content"
android:layout_height="wrap_content"。
android:text="這是一個長測驗文本。這是一個長的測驗文本。這是一個長的測驗文本。這是一個長的測驗文本。這是一個長的測驗文本。這是一個長的測驗文本。"/span>
android:maxLines="1"。
android:background="#6f6"/span> />
</LinearLayout>
(在AndroidManifest.xml中<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>是必填項)
uj5u.com熱心網友回復:
等待,直到TextView的布局之后,添加你的覆寫物。然后你可以強制你所需要的寬度--就像這樣:
findViewById<TextView>(R.id.textView).doOnNextLayout { textView ->
val view = LayoutInflater.from(this).inflate(R.layout. activity_main, null)
val params = WindowManager.LayoutParams(
textView.width,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
0,
PixelFormat.TRANSLUCENT
)
params.gravity = Gravity.START
val wm = getSystemService(WINDOW_SERVICE) as WindowManager
wm.addView(view, params)
}
不清楚為什么添加的LinearLayout及其TextView的寬度受到限制。
uj5u.com熱心網友回復:
在看了Cheticamps的回答后,我又搜索了一下,發現了一個解決方案,它只適用于一個視圖的實體,并且會自動調整大小。
擴展TextView(或AppCompatTextView),并覆寫了onMeasure:
class UnlimWidthTextView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null)。AppCompatTextView(context, attrs) {
val unlimitedWidth = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
super.onMeasure(unlimitedWidth, heightMeasureSpec)
}
要注意這一點,因為它完全取消了對文本最大寬度的限制。
原來的widthMeasureSpec總是有一個420px的寬度和MeasureSpec.AT_MOST的模式,這解釋了問題中顯示的行為。
但我沒有找到這個420px的限制是怎么來的。
高度有螢屏高度的預期值--導航欄和MeasureSpec.AT_MOST,所以它的行為符合預期。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/313071.html
標籤:

