字符串显示时的宽度通过字符串的个数/长度是没有办法取得
因为涉及到字体,大小,全角/半角,
甚至英文字i和T的宽度也是截然不同的。
使用下面的方法, 可以取得字符串显示的宽度。
TextPaint paint = view.getPaint();
int width = Layout.getDesiredWidth(source, start, index,
paint);
TextView view是显示字符串的TextView
CharSequence source 是字符串配列
int start是开始位置。
int index是字符个数
使用例:
mainActivity
-------------------------------------------------------------------------------------------------
mItem
= new ArrayList();
mItem.add("あいうえおーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー");
if
(progDataAryList != null) {
for
(int i = 0; i < progDataAryList.size(); i++) {
mItem.add(((String[])
progDataAryList.get(i))[1]);
}
}
MyAdapter
myAdapter = new MyAdapter(activity, R.layout.simple_list_item,
R.id.simple_list_text1, mItem);
//
アダプターを設定します
listView.setAdapter(myAdapter);
-------------------------------------------------------------------------------------------------
private class MyAdapter extends ArrayAdapter {
private
int mResource;
private
int mFieldId;
private
LayoutInflater mInflater;
private
List mStringobjects = new ArrayList();
public
MyAdapter(Context context, int resource, int textViewResourceId,
List objects) {
super(context,
resource, textViewResourceId, objects);
mResource
= resource;
mFieldId
= textViewResourceId;
mInflater
=
(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mStringobjects
= objects;
}
public
View getView(int position, View convertView, ViewGroup parent)
{
View
view;
TextView
text;
if
(convertView == null) {
view
= mInflater.inflate(mResource, parent, false);
}
else {
view
= convertView;
}
try
{
text
= (TextView)view.findViewById(mFieldId);
}
catch (ClassCastException e) {
String
stack = Log.getStackTraceString(e);
SaveLog.put(activity,
stack);
throw
new IllegalStateException("resource ID error", e);
}
text.setFilters(new
InputFilter[] {new LineFeedFilter(text)});
text.setText(mStringobjects.get(position));
ListView
listView = (ListView)
activity.findViewById(R.id.prog_listview1);
if
(position == listView.getCheckedItemPosition()) {
if
(convertView != null) {
convertView.setBackgroundResource(R.drawable.textviewtype2);
}
}
else {
if
(convertView != null) {
convertView.setBackgroundColor(Color.TRANSPARENT);
}
}
return
view;
}
}
-------------------------------------------------------------------------------------------------
private class LineFeedFilter implements InputFilter {
private
final TextView view;
public
LineFeedFilter(TextView view) {
this.view
= view;
}
public
CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend) {
TextPaint
paint = view.getPaint();
int
width = view.getWidth() - view.getCompoundPaddingLeft() -
view.getCompoundPaddingRight();
if
(width <= 0){
ListView
listView = (ListView)
activity.findViewById(R.id.prog_listview1);
width
= listView.getWidth() - listView.getPaddingLeft()
-listView.getPaddingRight()
-
view.getCompoundPaddingLeft() -
view.getCompoundPaddingRight();
}
SpannableStringBuilder
result = new SpannableStringBuilder();
for
(int index = start; index < end; index++) {
if
(Layout.getDesiredWidth(source, start, index + 1, paint) >
width) {
//
幅を越えたら改行を挿入
result.append(source.subSequence(start,
index));
result.append("\n");
start
= index;
}
else if (source.charAt(index) == '\n') {
//
改行文字があれば、ここまで出力
result.append(source.subSequence(start,
index));
start
= index;
}
}
if
(start < end) {
//
残りの文字を追加
result.append(source.subSequence(start,
end));
}
return
result;
}
}