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
Button
to aViewGroup
, here's what you can do in your extended Button class:Remove:
Add the following to
ScheduleItemView's
constructor:Add this helper method which sums up a
float
array: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
title
androomId
to 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: