I make a
android application with a button where in there a total of 4 texts and I want to align the first 2. One at the most left side of the bottom text and the other and the right side of the bottom text.
So from this:

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

setText(declare here a spannable);
I think I should work with Spannable, I've tried some things with Alignment.ALIGN_NORMAL and Alignment.ALIGN_OPPOSITE but I think is should first calculate the length of the bottom text and then do the alignment. (I've found a good example here but it's not working in my set-up).
I hope that someone can point me to a good direction.
Edit:
The reason that I can not (I think) use RelativeLayout or LinearLayout is that I'm extending button in a different class (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());
}
}
I've tried to do this in protected void onLayout (ScheduleItemsLayout.java):
child.setLayoutParams(new LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
But that's not working. I'm not sure if I should use new RelativeLayout(this).
Is it better to use Spannable in this case?
The source of the project can be downloaded here (which you can import in Eclipse)
Well, if you can't make the move from
Buttonto aViewGroup, here's what you can do in your extended Button class:Remove:
Add the following to
ScheduleItemView'sconstructor:Add this helper method which sums up a
floatarray:Not sure why you're overriding the
onDraw(Canvas)andonMeasure(int, int)methods.Needless to say, this is one convoluted code snippet. What's happening is that we're measuring how much space we must put between
titleandroomIdto get the desired alignment. The code is straight-forward (though cringe-worthy), so no comments have been included.On the other hand, you could extend RelativeLayout:
Here, we create three TextViews, and set their LayoutParams to get proper alignment.
Output is the same for both, though I would recommend the second approach: