这里先计算左边title的最大宽度,同时将所有的数据拼接成一个SpannableStringBuilder,调用setText函数会触发重绘,在onDraw函数中进行处理,由于未重新super函数,因此SpannableString的setSpan函数失效,该方案主要根据分隔符来进行分割,因此分隔符需要唯一。
方案4采用GridLayout方式实现,但是原始控件有展示问题,因此对此进行了修改:
public class Typography4Activity extends BaseActivity { (Context context) { Intent intent = new Intent(); intent.setClass(context, Typography4Activity.class); context.startActivity(intent); } private LinearLayout root; private Paint leftPaint = new Paint(); private float textSize; private float maxLeftWidth; private int middlePadding = 0; private float maxRightWidth; @Override (Bundle savedInstanceState) { super.onCreate(savedInstanceState); root = (LinearLayout) LayoutInflater.from(this).inflate(R.layout.activity_typography4, null); setContentView(root); initPaint(); findViews(); loadData(); } () { textSize = getResources().getDimensionPixelSize(R.dimen.text_size_13); leftPaint.setAntiAlias(true); leftPaint.setTextSize(textSize); leftPaint.setColor(getResources().getColor(R.color.color_black_999999)); middlePadding = getResources().getDimensionPixelSize(R.dimen.padding_value); } () { } () { addGridLayout(DataSource.getArray()); TextView view = new TextView(this); view.setText("修改后的实现"); view.setGravity(Gravity.CENTER); view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 160)); root.addView(view); addModifyGridLayout(DataSource.getArray()); } (JSONArray data) { try { GridLayout layout = createGridLayout(); int size = data.length(); for (int i = 0; i < size; ++i) { JSONArray item = (JSONArray) data.get(i); String key = item.getString(0); String value = (item.length() >= 2) ? item.getString(1) : ""; GridLayout.Spec row = GridLayout.spec(i); GridLayout.Spec col1 = GridLayout.spec(0); GridLayout.Spec col2 = GridLayout.spec(1); GridLayout.LayoutParams params = new GridLayout.LayoutParams(row, col1); TextView title = getLeftTextView(key); layout.addView(title, params); params = new GridLayout.LayoutParams(row, col2); TextView desc = getRightTextView(value); layout.addView(desc, params); } root.addView(layout); } catch (Exception e) { } } @NonNull private TextView getRightTextView(String value) { TextView desc = new TextView(this); desc.setTextSize(13); desc.setTextColor(getResources().getColor(R.color.black)); desc.setText(value); return desc; } @NonNull private TextView getLeftTextView(String key) { TextView title = new TextView(this); title.setText(key); title.setPadding(0, middlePadding, middlePadding, 0); title.setTextColor(getResources().getColor(R.color.color_black_999999)); title.setTextSize(13); return title; } (JSONArray data) { try { calculateLeftMaxWidth(data); GridLayout layout = createGridLayout(); int size = data.length(); for (int i = 0; i < size; ++i) { JSONArray item = (JSONArray) data.get(i); GridLayout.Spec row = GridLayout.spec(i); String key = item.getString(0); GridLayout.Spec col1 = GridLayout.spec(0); GridLayout.LayoutParams params = new GridLayout.LayoutParams(row, col1); TextView title = getLeftTextView(key); layout.addView(title, params); String value = (item.length() >= 2) ? item.getString(1) : ""; GridLayout.Spec col2 = GridLayout.spec(1); params = new GridLayout.LayoutParams(row, col2); TextView desc = getRightTextView(value); params.width = (int) maxRightWidth; params.height = ViewGroup.LayoutParams.WRAP_CONTENT; layout.addView(desc, params); } root.addView(layout); } catch (Exception e) { } } (JSONArray data) { try { DisplayUtil.init(this);// 这个可以在应用程序起来的时候init int size = data.length(); for (int i = 0; i < size; ++i) { JSONArray o = (JSONArray) data.get(i); String key = o.getString(0); String value = o.getString(1); if (TextUtils.isEmpty(key) || TextUtils.isEmpty(value)) { continue; } float curWidth = leftPaint.measureText(key); if (curWidth > maxLeftWidth) { maxLeftWidth = curWidth; } } maxLeftWidth = maxLeftWidth + middlePadding; maxRightWidth = DisplayUtil.screenWidth - DisplayUtil.dp2px(this, 32 + 10) - maxLeftWidth; } catch (Exception e) { } } private GridLayout createGridLayout() { GridLayout layout = new GridLayout(this); layout.setColumnCount(2); //layout.setRowCount(5); layout.setOrientation(GridLayout.HORIZONTAL); return layout; } }