web-dev-qa-db-ja.com

textview.getLineCountは常にandroid

テキストビューを動的にサイズ変更しようとしていますが、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以外です。

誰か助けてもらえますか?

よろしくお願いします。

35
neha

私はこの質問がかなり古いことを知っていますが、誰かが実際の答えを探してここに来た場合に備えて:

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.
    }
});
80
Scott

それは、postメソッドによってUIスレッドで実行する必要があります。

textView.post(new Runnable() {
    @Override
    public void run() {
        Log.v("Line count: ", textView.getLineCount()+"");
    }
});
21
Nima K

この問題を修正するには、次の行を適用します。

textView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        if (textView.getLineCount() > 1) {
            textView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        }
    }
});

OnGlobalLayoutListenerは、TextViewを変更するたびに呼び出されます(測定後、描画後など)。ここでは、画面に表示される前にTextViewへの変更をキャッチし、必要な操作を行うことができます。

コードの最後の行はリスナーを削除することです。これは、レイアウトの変更をキャッチし続けたくないので重要です。

21
Nativ

getLineCount()は、レイアウトパスの後でのみ正しい行数を提供します。つまり、TextViewは少なくとも1回描画されている必要があります。この時点ではテキストビューが描画されていないため、行数として0を取得していると思います

7
DeRagan

実際には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();
        }
2
LinWei

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.       
    }
}
0
BlacklegSanji