alignment2个文本,1个正常,1个相反

我做了一个 Android的应用程序,其中有一个button,其中总共有4个文本,我想alignment第一个2.一个在底部文本的最左边,另一个在底部文本的右边。

所以从这个:

之前

setText(item.title + " " + item.roomId + "\n" + item.teacher + " " + item.classes);

对此:

之后(这是我想要的)

setText(declare here a spannable);

我想我应该与Spannable一起工作,我已经尝试了一些Alignment.ALIGN_NORMALAlignment.ALIGN_OPPOSITE东西,但我认为应该首先计算底部文本的长度,然后进行alignment。 (我已经在这里find了一个很好的例子,但是在我的设置中不起作用)。

我希望有人能指点我一个好的方向。

编辑:

我不能(我认为)使用RelativeLayoutLinearLayout是我扩展button在不同的类( ScheduleItemView.java ):

 /** * Custom view that represents a {@link ScheduleItem} instance, including its * title and time span that it occupies. Usually organized automatically by * {@link ScheduleItemsLayout} to match up against a {@link TimeRulerView} * instance. */ public class ScheduleItemView extends Button { private ScheduleItem mItem; public ScheduleItemView(Context context, ScheduleItem item) { super(context); mItem = item; setSingleLine(false); setText(item.title + " " + item.roomId + "\n" + item.teacher + " " + item.classes); // TODO: turn into color state list with layers? int textColor = Color.WHITE; int accentColor = item.accentColor; LayerDrawable buttonDrawable = (LayerDrawable) context.getResources() .getDrawable(R.drawable.btn_block); buttonDrawable.getDrawable(0).setColorFilter(accentColor, PorterDuff.Mode.SRC_ATOP); buttonDrawable.getDrawable(1).setAlpha(item.containsStarred ? 255 : 0); setTextColor(textColor); setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources() .getDimensionPixelSize(R.dimen.text_size_small)); setGravity(Gravity.CENTER | Gravity.BOTTOM); setBackgroundDrawable(buttonDrawable); } public ScheduleItem getScheduleItem() { return mItem; } @Override public void onDraw(Canvas canvas) { super.onDraw(canvas); measure(MeasureSpec.makeMeasureSpec(getMeasuredWidth(), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec( getMeasuredHeight(), MeasureSpec.EXACTLY)); // layout(getLeft(), getTop(), getRight(), getBottom()); setGravity(Gravity.CENTER); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(getRight() - getLeft(), getBottom() - getTop()); } } 

我试图在protected void onLayoutScheduleItemsLayout.java )中做到这一点:

 child.setLayoutParams(new LayoutParams( LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); 

但是这不起作用。 我不确定是否应该使用new RelativeLayout(this)

在这种情况下使用Spannable更好吗?

项目的来源可以在这里下载(你可以在Eclipse中导入)

Solutions Collecting From Web of "alignment2个文本,1个正常,1个相反"

那么,如果你不能从ButtonViewGroup ,你可以在扩展的Button类中做什么:

去掉:

 setText(item.title + " " + item.roomId + "\n" + item.teacher + " " + item.classes); 

将以下内容添加到ScheduleItemView's构造函数中:

 float[] fl1 = new float[item.title.length()]; getPaint().getTextWidths(item.title, fl1); float[] fl2 = new float[item.roomId.length()]; getPaint().getTextWidths(item.roomId, fl2); float[] fl3 = new float[item.teacher.length() + item.classes.length() + 1]; getPaint().getTextWidths(item.teacher + " " + item.classes, fl3); float differenceInWidth = sumUpTheArray(fl3) - sumUpTheArray(fl1) - sumUpTheArray(fl2); float fSpaceArray[] = new float[1]; getPaint().getTextWidths(" ", fSpaceArray); int numOfSpaces = (int) (differenceInWidth / fSpaceArray[0]); char[] spaceCharArr = new char[numOfSpaces]; Arrays.fill(spaceCharArr, ' '); setText(item.title + String.valueOf(spaceCharArr) + item.roomId + "\n" + item.teacher + " " + item.classes); 

添加这个总结float组的辅助方法:

 public float sumUpTheArray(float[] arr) { float sum = 0f; for (int i = 0; i < arr.length; i++) { sum += arr[i]; } return sum; } 

不知道为什么你重写onDraw(Canvas)onMeasure(int, int)方法。

不用说,这是一个令人费解的代码片段。 发生什么事情是我们正在测量title和空间之间必须有多less空间来达到理想的alignment。 代码是直截了当(尽pipe值得),所以没有任何意见。

另一方面,你可以扩展RelativeLayout:

 public class ScheduleItemAlternateView extends RelativeLayout { private ScheduleItem mItem; public ScheduleItemAlternateView(Context context, ScheduleItem item) { super(context); mItem = item; int textColor = Color.WHITE; int accentColor = item.accentColor; LayerDrawable buttonDrawable = (LayerDrawable) context.getResources() .getDrawable(R.drawable.btn_block); buttonDrawable.getDrawable(0).setColorFilter(accentColor, PorterDuff.Mode.SRC_ATOP); buttonDrawable.getDrawable(1).setAlpha(item.containsStarred ? 255 : 0); // Three TextViews to hold the `title`, `roomId` // and `teacher&room` independently TextView tvTitle = new TextView(context); TextView tvRoomId = new TextView(context); TextView tvTeacherAndClasses = new TextView(context); // Example ids tvTitle.setId(100); tvRoomId.setId(101); tvTeacherAndClasses.setId(102); tvTitle.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources() .getDimensionPixelSize(R.dimen.text_size_small)); tvRoomId.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources() .getDimensionPixelSize(R.dimen.text_size_small)); tvTeacherAndClasses.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources() .getDimensionPixelSize(R.dimen.text_size_small)); tvTitle.setPadding(30, 20, 30, 0); tvRoomId.setPadding(30, 20, 30, 0); tvTeacherAndClasses.setPadding(30, 5, 30, 20); tvTitle.setTextColor(textColor); tvRoomId.setTextColor(textColor); tvTeacherAndClasses.setTextColor(textColor); // Set text tvTitle.setText(item.title); tvRoomId.setText(item.roomId); tvTeacherAndClasses.setText(item.teacher + " " + item.classes); // LayoutParms RelativeLayout.LayoutParams paramsTitle = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); paramsTitle.addRule(RelativeLayout.ALIGN_LEFT, tvTeacherAndClasses.getId()); RelativeLayout.LayoutParams paramsRoomId = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); paramsRoomId.addRule(RelativeLayout.ALIGN_RIGHT, tvTeacherAndClasses.getId()); RelativeLayout.LayoutParams paramsTeacherAndClasses = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); paramsTeacherAndClasses.addRule(RelativeLayout.CENTER_HORIZONTAL); paramsTeacherAndClasses.addRule(RelativeLayout.BELOW, tvTitle.getId()); // Add Views to this RelativeLayout addView(tvTitle, paramsTitle); addView(tvRoomId, paramsRoomId); addView(tvTeacherAndClasses, paramsTeacherAndClasses); // Set the background as LayerDrawable setBackgroundDrawable(buttonDrawable); } } 

在这里,我们创build三个TextViews,并设置他们的LayoutParams来正确alignment。

两者的输出是相同的,但我会推荐第二种方法:

在这里输入图像说明

我发现实现这种行为的最简单的方法之一是利用android layout_weight属性,如下所示:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="30dp" android:background="@color/Orange" android:orientation="vertical" android:padding="20dp" > <LinearLayout android:layout_width="fill_parent" android:layout_height="match_parent" android:orientation="horizontal" > <TextView android:id="@+id/top_left_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:text="SCHK" /> <LinearLayout android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" > </LinearLayout> <TextView android:id="@+id/top_right_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="G102" /> </LinearLayout> <TextView android:id="@+id/bottom_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:text="VIM M4O3WI, M404WI, M402SJ" /> </LinearLayout> 

通过这种方式,重量为1的LinearLayout将占用所需的空间,以便根据需要正确分离顶行上的两个string。

另外你为什么“在不同的类中扩展Button”? 如果你纯粹为了获得问题中显示的圆angular/橙色背景,可以通过将顶级线性布局的背景设置为button样式的背景来获得相同的效果。

在RelativeLayout中使用3个TextViews。

title

  android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_centerVertical="true" 

roomId

  android:id="@+id/roomId" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" 

teacher

  android:id="@+id/teacher" android:layout_below="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_centerHorizontal="true" android:layout_centerVertical="true"