我正在尝试在一个按钮内使用两个带有不同字体的TextView自定义按钮。为此,我只是扩展了Button,并在构造函数中编写了以下代码,
LayoutInflater layoutInflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View layout = layoutInflater.inflate(R.layout.custom_button,
(ViewGroup) findViewById(R.id.custom_button_view));
TextView firstTextView = (TextView) layout
.findViewById(R.id.firstTextView);
TextView secondTextView = (TextView) layout
.findViewById(R.id.secondTextView);
在布局custom_button中我放置了两个不同字体和文本的TextView,custom_button_view是该LinearLayout的ID,我得到的是一个没有文字的空按钮。
任何想法,谢谢。
答案 0 :(得分:8)
您可以通过将自定义按钮样式设置为布局来使用布局作为按钮,并可以向其中添加两个textView,这样:
<LinearLayout android:id="@+id/customButtonLayout"
android:layout_height="wrap_content" style="@android:style/Widget.Button"
android:layout_width="wrap_content">
<TextView android:text="First" android:id="@+id/firstTextView"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:textColor="#000"></TextView>
<TextView android:textColor="#000" android:text="Second"
android:layout_height="wrap_content" android:id="@+id/secondTextView"
android:layout_width="wrap_content" android:layout_marginLeft="10dp"></TextView>
</LinearLayout>
在Activity中你可以设置不同的字体:
Typeface font=Typeface.createFromAsset(getAssets(),"ARIALN.TTF") ;
Typeface font2=Typeface.createFromAsset(getAssets(), "COMPCTAN.TTF");
TextView firstTextView = (TextView)findViewById(R.id.firstTextView);
TextView secondTextView = (TextView)findViewById(R.id.secondTextView);
firstTextView.setTypeface(font);
secondTextView.setTypeface(font2);
LinearLayout btnLayout=(LinearLayout) findViewById(R.id.customButtonLayout);
btnLayout.setOnClickListener(this);
答案 1 :(得分:2)
您可以从Button派生一个新类并覆盖onDraw(Canvas画布)方法。我做了一个带有图标和文本的按钮,它没有任何xml。主要问题是将文本写在按钮上的好位置。为此,您可以使用Paint.getTextBounds()函数来获取文本尺寸。
使用LayoutInflater可能是一种更好的做法,但我没有设法让它工作。
public class CustomButton extends Button {
private int mWidth;
private int mHeight;
private Bitmap mBitmap;
private String mText;
private Paint mPaintIcon;
private Rect mRectIconSrc;
private Rect mRectIconDst;
private Paint mPaintText;
public CustomButton(Context context, Bitmap bitmap, int width, int height, String text) {
super(context);
mBitmap = bitmap;
mWidth = width;
mHeight = height;
mText = text;
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(width, height);
setLayoutParams(params);
mPaintIcon = new Paint();
mRectIconSrc = new Rect(0, 0, mBitmap.getWidth(), mBitmap.getHeight());
mRectIconDst = new Rect(0, 0, mHeight, mHeight);
mPaintText = new Paint();
mPaintText.setColor(0xFF778800);
mPaintText.setTextSize(30);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawBitmap(mBitmap, mRectIconSrc, mRectIconDst, mPaintIcon);
canvas.drawText(mText, mWidth/4, mHeight*2/3, mPaintText);
}
}
答案 2 :(得分:0)
您可以使用button
包围FrameLayout
,然后在textview
中添加FrameLayout
。您可以管理活动中的字体。如果文字没有显示尝试使用bringToFront()
布局:
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:id="@+id/button_frame"
>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/button_border"
android:gravity="center"
android:onClick="onClick"
android:text="@string/get_more"
android:id="@+id/get_more"
android:stateListAnimator="@null"
/>
<TextView
android:id="@+id/linearTimer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_gravity="right"
android:padding="10dp"
android:text="123"
>
</FrameLayout>
的活动:
countDownView = (TextView) findViewById(R.id.linearTimer);
Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/digital-7.ttf");
countDownView.setTypeface(tf);
countDownView.bringToFront();