私は何時間も答えを探していて、解決方法は本当に分かりません。それでは、仕事に取り掛かるてみましょう:画像とTextView
がありフローテキストビューでのイメージ
と私はこのようなImageView
周りTextView
を流す必要があります。
まず可能な解決策はhttps://github.com/deano2390/FlowTextViewを使用することwoultが、それはですTextView
を拡張していないので、このライブラリは数多くの理由から私には適していません。
第2の解決策はLeadingMarginSpan.LeadingMarginSpan2
スパンを使用することですが、それはに(この答えのように - >How to layout text to flow around an image)テキスト内の各n行のための各段落に影響を与えますので、私はこのようになめらかを得る:
しかし最初のn行だけにマージンを設定したかったのです!その後、LeadingMarginSpan.Standart
を実装してカウンタを作成し、それを関数呼び出しのgetLeadingMargin(first: Boolean): Int
でインクリメントすることにしました。カウンタが望ましい値に達すると、関数はマージンの幅として0を返します。もう一度失敗します! TextView
行を塗りつぶす代わりに、テキストがちょうど左に移動し、ビューの最後に広がっていませんでした!
UPD:はい、私はここに
でonGlobalLayoutListener
を使用しましたまあ、私はこの答えhttps://stackoverflow.com/a/27064368/7218592 は[OK]を見つけ、別の解決策をグーグルで、私が説明するように、すべてを行って、コードを実装しました:
//set left margin of desirable width
val params: RelativeLayout.LayoutParams = RelativeLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
params.leftMargin = holder.imageContainerHeight!!
params.addRule(RelativeLayout.BELOW, holder.mNumberAndTimeInfo!!.id)
holder.mCommentTextView!!.layoutParams = params
if (holder.commentTextViewOnGlobalLayoutListener != null)
holder.mCommentTextView!!.viewTreeObserver.removeOnGlobalLayoutListener(
holder.commentTextViewOnGlobalLayoutListener)
//add onGlobalLayoutListener
holder.mCommentTextView!!.viewTreeObserver.addOnGlobalLayoutListener(
if (holder.commentTextViewOnGlobalLayoutListener != null)
holder.commentTextViewOnGlobalLayoutListener
else CommentTextViewOnGlobalLayoutListener(holder,
SpannableString(HtmlCompat.fromHtml(
mView.getActivity(), commentDocument.html(), 0,
null, SpanTagHandlerCompat(mView.getActivity())))))`
マイOnGlobalLayoutListener
は次のようになります。 `
class CommentTextViewOnGlobalLayoutListener(
val holder: CommentAndFilesListViewViewHolder, val commentSpannable: Spannable) :
ViewTreeObserver.OnGlobalLayoutListener {
val LOG_TAG: String = CommentTextViewOnGlobalLayoutListener::class.java.simpleName
override fun onGlobalLayout() {
holder.mCommentTextView!!.viewTreeObserver.removeGlobalOnLayoutListener(this)
//when textview layout is drawn, get the line end to spanify only the needed text
val charCount = holder.mCommentTextView!!.layout.getLineEnd(Math.min(
holder.mCommentTextView!!.layout.lineCount - 1,
CommentLeadingMarginSpan.computeLinesToBeSpanned(holder)))
if (charCount <= commentSpannable.length) {
commentSpannable.setSpan(CommentLeadingMarginSpan(holder),
0, charCount, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
}
//set the left margin back to zero
(holder.mCommentTextView!!.layoutParams as RelativeLayout.LayoutParams).leftMargin = 0
holder.mCommentTextView!!.text = commentSpannable
}
}
これはうまく動作します。しかし、それがいかに恐ろしいか!私はビューホルダーのパターンを使用しているので、私はリスナーに変数を保持し、それが呼び出されていないと正常に削除されている場合は削除する必要がありますonGlobalLayout
関数は時間内に呼び出されていない!そしてそれは遅すぎるので、約300ミリ秒待ってからTextView
のすべての "再構成"を見る必要があり、それは嫌になります!
だから、私の質問は: それはUI上に描かれています前に、TextView
に最初 n行のためのマージンを作るには?
私はここのWebViewを使用し、そこ –
WebViewの中で画像とテキストを設定します、ここでは異なるアプローチをしようと、私は必要ないくつかのカスタムクリック可能なスパンがあるので、オプションではありません処理する。私はそれらを放棄することはできません:( – koresuniku
[画像の周りを流れるテキストをレイアウトする方法](https://stackoverflow.com/questions/2248759/how-to-layout-text-to-flow-around-画像) –