关于TextView 宽度过大导致Drawable无法居中问题

在Android开发中,遇到TextView宽度填满导致Drawable无法居中的问题。通常通过设置DrawableLeft等属性结合Gravity:center来实现图文居中,但当TextView宽度为fill_parent或使用权重时,这种方法失效。为解决此问题,可以考虑外层加布局并设置TextView宽度为wrap_content,但这可能导致布局层级过深引发StackOverflowError。文章提供了一种解决办法,但存在文字不能换行的局限性。
摘要由CSDN通过智能技术生成

在做项目的时候,很多时候我们都要用到文字和图片一起显示,一般设置TextView的DrawableLeft、DrawableRight、DrawableTop、DrawableBottom就行了。但是有一种情况是当TextView的熟悉是fill_parent或者使用权重的时候并且设置了起Gravity的ceter的时候,Drawable图片是无法一起居中的,为了解决其,我们一般再套一层布局,然后设置TextView的熟悉是wrap_content,但是有时候嵌套过多的布局的时候,有可能发生StackOverFlow,所以必须要优化,下面说一下其中的一个解决方案。先上图


这个解决方案很粗糙,局限性很大,文字不能换行,换行之后就不准了,下面是源码:

package com.example.testandroid;

import java.lang.ref.WeakReference;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.TextView;

public class DrawableTextView extends TextView {

	private WeakReference<Bitmap> normalReference;
	private WeakReference<Bitmap> pressReference;
	private WeakReference<Bitmap> showReference;

	private int normalColor = Color.WHITE, pressColor = Color.WHITE;

	private String text;
	private int textWidth = 0;
	private int textHeight = 0;

	public Drawab
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
实现这个需求,你需要创建一个自定义的弹窗布局文件和一个自定义的长按事件监听器。以下是实现步骤: 1. 创建自定义弹窗布局文件 在你的工程中创建一个新的布局文件,例如`popup_textview.xml`,并添加一个TextView作为弹窗的内容显示区域。设置TextView宽度和高度为固定值,并将其文字居中显示。另外,你需要设置背景颜色为半透明效果,可以使用`#80000000`这个颜色值。最后,使用`RelativeLayout`或者`FrameLayout`等布局容器将TextView包裹起来。 示例代码: ``` <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#80000000"> <TextView android:id="@+id/tv_popup_content" android:layout_width="200dp" android:layout_height="100dp" android:gravity="center" android:textColor="#ffffff" android:textSize="20sp" /> </FrameLayout> ``` 2. 实现长按事件监听器 在你的Activity中,创建一个自定义的长按事件监听器,该监听器将在用户长按TextView时触发,并显示弹窗。在弹窗中,你需要将TextView的值设置为弹窗的内容。 示例代码: ``` textView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { // 创建弹窗实例 PopupWindow popupWindow = new PopupWindow(context); // 加载弹窗布局 View popupView = LayoutInflater.from(context).inflate(R.layout.popup_textview, null); TextView tvPopupContent = popupView.findViewById(R.id.tv_popup_content); tvPopupContent.setText(textView.getText()); // 设置弹窗属性 popupWindow.setContentView(popupView); popupWindow.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT); popupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT); popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); popupWindow.setOutsideTouchable(true); popupWindow.setFocusable(true); // 显示弹窗 popupWindow.showAsDropDown(textView); // 点击空白区域关闭弹窗 popupView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_OUTSIDE) { popupWindow.dismiss(); return true; } return false; } }); return true; } }); ``` 在以上代码中,我们首先创建了一个PopupWindow实例,并加载弹窗布局文件。接着,我们设置了弹窗的属性,包括宽度、高度、背景、点击外部区域关闭等。最后,我们调用`showAsDropDown()`方法显示弹窗,并设置了点击空白区域关闭弹窗的事件监听器。 3. 将监听器应用到TextView上 在你的代码中,将以上长按事件监听器应用到需要显示弹窗的TextView上即可。 示例代码: ``` TextView textView = findViewById(R.id.tv_example); textView.setOnLongClickListener(new PopupWindowLongClickListener(this, textView)); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值