単一行の LinearLayouts の行内に TextViews を配置して、画面に多数のテキストを表示しようとしています。各単語は独自の個別の TextView に格納されます。1 つの LinearLayout 行に収まる数の TextView を配置し、水平方向のスペースが不足したことを検出して次の行に移動できるようにしたいと考えています。
私が直面している問題はgetWidth()
、親レイアウトを使用して参照幅を取得できないため、表示を作成するときに変化するレイアウトサイズを測定する方法を見つけることができないように見えることです. TextViews、幅を制御できないようです。
以前は動作するバージョンがありましたが、固定サイズの TextView 内の文字数に基づいてハードコードされた数値を使用してすべてを実行していました。すべてのテキストと画面サイズで動作するようにアプリを拡張しようとしています。これを完全に見直す必要がある場合は、理解しています。画面を無数のテキスト行で埋められるようにしたいだけです。
明らかな解決策は、すべてのテキストを 1 つの TextView 内に配置することですが、表示された TextView を介して各 Word/Poctuation オブジェクトとその属性にアクセスできる必要があります。
// layout_row is the current LinearLayout row I'm adding my TextViews to
// layout is the LinearLayout parent of all layout_rows
// text.text_content is a linked list of Word and Ponctuation objects
// each Word and Ponctuation object has a TextView attribute called view
private void display_views() {
if (text != null)
{
boolean prochainLigneSuivante; // if new line is to follow
int widthSoFar = 0;
int layoutWidth = layout_row.getWidth();
for (Object o : text.text_content) {
if (o instanceof Word ) {
Word w = (Word) o;
Object next = text.next(o);
if (noNeedForSpace(w)) {
// by default all TextViews have
// right padding to simulate spaces
w.view.setPadding(0, 0, 0, 0);
}
layout_row.addView(w.view);
widthSoFar += w.view.getWidth();
// Am I out of space?
prochainLigneSuivante = widthSoFar >= layoutWidth;
if(prochainLigneSuivante) {
layout_row.removeView(w.view);
widthSoFar = 0;
layout_row = new LinearLayout(context);
layout_row.setOrientation(LinearLayout.HORIZONTAL);
layout_row.addView(w.view);
layout_row.setBackgroundColor(Color.BLACK);
layout_row.setLayoutParams(new
LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.MATCH_PARENT));
layout.addView(layout_row);
}
}
else if (o instanceof Ponctuation) {
Ponctuation p = (Ponctuation) o;
if (p.text.contains("CR")) {
layout_row = new LinearLayout(context);
layout_row.setOrientation(LinearLayout.HORIZONTAL);
layout_row.setLayoutParams(new
LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.MATCH_PARENT));
widthSoFar = 0;
layout.addView(layout_row);
}
else {
if (p.view.getText().equals(" "))
p.view.setPadding(0, 0, 0, 0);
layout_row.addView(p.view);
if(!p.view.getText().equals(""))
widthSoFar += p.view.getWidth();
}
}
}
}
else {
Log.e("Text", "text est nul");
}
scroll.refreshDrawableState();
transition.startTransition(0);
}