getLayout が null を返す TextView があります。ドキュメントによると、これは「通常」です。直前にレイアウトに追加した後、幅が変更されるためです。
これを回避する方法は?
(私は OnGlobalLayoutListener を試してみましたが、それが全幅になるのを待っていましたが、常に機能するとは限りません)
編集: getView() で、リスト アダプターから呼び出します。
drawArticle(article, true);
drawArticle() メソッドは次のとおりです。
TextView txt;
Spanned text;
private void drawArticle(final Article article, boolean first) {
if(first){
text = Html.fromHtml(article.content);
} else {
text = Html.fromHtml(getInvisibleText(txt));
}
txt = createTextView();
txt.setText(text);
layout.addView(txt);
vto = txt.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
txt.getViewTreeObserver().removeGlobalOnLayoutListener(this);
String inVisibleText = getInvisibleText(txt);
if (inVisibleText != null && !inVisibleText.isEmpty()) {
drawArticle(article, false);
}
}
});
}
と
private String getInvisibleText(final TextView textView) {
Layout staticLayout = null;
String toDislay = "";
int height = textView.getHeight();
int scrollY = textView.getScrollY();
staticLayout = textView.getLayout();
int lastVisibleLineNumber = staticLayout.getLineForVertical(scrollY+height);
int start = staticLayout.getLineEnd(lastVisibleLineNumber);
int end = staticLayout.getLineEnd(textView.getLineCount()-1);
toDislay = textView.getText().toString().substring(start, end);
return toDislay;
}
これは、非常に長いテキストをテキストビューに設定し、表示されていないものを再帰的に他のテキストビューに入れることを想定しています