字符串显示时的宽度通过字符串的个数/长度是没有办法取得
因为涉及到字体,大小,全角/半角,
甚至英文字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<String>();
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<String> {
private int mResource;
private int mFieldId;
private LayoutInflater mInflater;
private List<String> mStringobjects = new ArrayList<String>();
public MyAdapter(Context context, int resource, int textViewResourceId, List<String> 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;
}
}
http://blog.sina.com.cn/s/blog_54109a580101beiw.html