自定义带标题与描述的ProgressBar出现全屏异常问题求助
问题分析与解决方案
你遇到的问题根源很明显:在自定义ProgressBar的构造函数里调用了Activity.setContentView(),这个方法是用来替换整个Activity的布局的,而不是给你的自定义控件加载内部视图,所以每次创建这个控件,都会把当前Activity的整个界面换成你的myprogressbarlayout,自然就出现了奇怪的全屏显示。
正确的实现思路:做一个组合控件
要实现带标题和描述的进度条,我们应该做一个组合控件——也就是把标题TextView、描述TextView和ProgressBar打包成一个独立的控件,继承自LinearLayout或者RelativeLayout这类容器控件,而不是直接继承ProgressBar(它本身是单一的进度条控件,不适合直接附加其他视图)。
具体实现步骤
1. 完善你的布局文件 myprogressbarlayout.xml
确保布局是一个容器(比如垂直方向的LinearLayout),把三个控件合理排列:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="8dp"> <TextView android:id="@+id/mybartitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="16sp" android:textStyle="bold"/> <TextView android:id="@+id/mybardescription" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="14sp" android:textColor="@android:color/darker_gray" android:layout_marginTop="4dp"/> <ProgressBar android:id="@+id/progress_bar" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="8dp"/> </LinearLayout>
2. 重写自定义控件类(继承LinearLayout)
把原来的CustomProgressBar改成继承LinearLayout,并通过LayoutInflater加载布局到当前控件内部,而不是操作Activity的布局:
public class CustomProgressBar extends LinearLayout { private TextView titleTv; private TextView descriptionTv; private ProgressBar progressBar; // 构造方法要覆盖所有重载形式 public CustomProgressBar(Context context) { super(context); initView(context); } public CustomProgressBar(Context context, AttributeSet attrs) { super(context, attrs); initView(context); } public CustomProgressBar(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initView(context); } // 初始化视图的核心方法 private void initView(Context context) { // 把布局加载到当前自定义控件中,第三个参数true表示把布局的子视图添加到当前控件 LayoutInflater.from(context).inflate(R.layout.myprogressbarlayout, this, true); // 绑定内部控件 titleTv = findViewById(R.id.mybartitle); descriptionTv = findViewById(R.id.mybardescription); progressBar = findViewById(R.id.progress_bar); } // 对外提供设置方法,方便调用 public void setTitle(String title) { titleTv.setText(title); } public void setDescription(String description) { descriptionTv.setText(description); } public void setProgress(int progress) { progressBar.setProgress(progress); } public void setMaxProgress(int max) { progressBar.setMax(max); } }
3. 在布局中使用自定义控件
像使用普通控件一样添加到你的Activity布局里:
<com.yourpackage.yourapp.CustomProgressBar android:id="@+id/custom_progress_bar" android:layout_width="match_parent" android:layout_height="wrap_content"/>
注意替换com.yourpackage.yourapp为你实际的包名。
4. 在Activity中调用控制
CustomProgressBar customProgressBar = findViewById(R.id.custom_progress_bar); customProgressBar.setTitle("文件下载"); customProgressBar.setDescription("已下载50%"); customProgressBar.setMaxProgress(100); customProgressBar.setProgress(50);
这样就能正常显示带标题和描述的进度条,不会再出现全屏覆盖的问题啦!
内容的提问来源于stack exchange,提问作者AndreaF
相关产品推荐
相关产品推荐

