テキストビューを動的にサイズ変更しようとしていますが、settext()およびinvalidate()の後でもgetlinecount()メソッドは常に0を返します。次のコードを使用しています。
if (convertView == null) {
convertView = lInflater.inflate(R.layout.listview, null);
holder = new ViewHolder();
holder.text2 = (TextView)convertView.findViewById(R.id.TextView02);
convertView.setTag(holder);
} else {
holder = (ViewHolder)convertView.getTag();
}
holder.text2.setText(arr2[position]);
holder.text2.invalidate();
int lineCnt = holder.text2.getLineCount();
ホルダーは、次のような静的クラスです。
static class ViewHolder {
TextView text2;
}
ホルダーにnull以外のtext2が含まれ、コンテンツセットもnull以外です。
誰か助けてもらえますか?
よろしくお願いします。
私はこの質問がかなり古いことを知っていますが、誰かが実際の答えを探してここに来た場合に備えて:
holder.text2.setText(arr2[position]);
holder.text2.post(new Runnable() {
@Override
public void run() {
int lineCnt = holder.text2.getLineCount();
// Perform any actions you want based on the line count here.
}
});
それは、postメソッドによってUIスレッドで実行する必要があります。
textView.post(new Runnable() {
@Override
public void run() {
Log.v("Line count: ", textView.getLineCount()+"");
}
});
この問題を修正するには、次の行を適用します。
textView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (textView.getLineCount() > 1) {
textView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
}
});
OnGlobalLayoutListener
は、TextView
を変更するたびに呼び出されます(測定後、描画後など)。ここでは、画面に表示される前にTextView
への変更をキャッチし、必要な操作を行うことができます。
コードの最後の行はリスナーを削除することです。これは、レイアウトの変更をキャッチし続けたくないので重要です。
getLineCount()は、レイアウトパスの後でのみ正しい行数を提供します。つまり、TextViewは少なくとも1回描画されている必要があります。この時点ではテキストビューが描画されていないため、行数として0を取得していると思います
実際にはTextView.getLineCount()はTextView.mLayout.getLineCountに依存していますが、TextView.mLayoutはonMeasureの前に遅延初期化されているため、次のようにすることができます。
if (holder.contentTV.getLayout() == null) {
holder.contentTV.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
holder.contentTV.getLineCount();
holder.contentTV.getViewTreeObserver().removeOnPreDrawListener(this);
return true;
}
});
} else {
holder.contentTV.getLineCount();
}
Asynctaskクラスを作成し、そのonPostExecuteメソッドでgetLineCount()関連のタスクを実行しました。
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
new myAsyncTask().execute(null, null, null);
}
private class myAsyncTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(final Void... params) {
// It's okay to leave this as it is
return null;
}
@Override
protected void onPostExecute(final Void result) {
super.onPostExecute(result);
//DO YOUR TASK HERE, getLineCount(), etc.
}
}