1

以下是列表视图项的非常简化的布局,它可以在多个不同的 android 4.x 设备上按预期运行,但不能在 android 2.3(设备和模拟器)上运行。

预期:进度条应覆盖该项目的整个背景,水平和垂直。 预期的

在 Android 2.3 上:当进度设置 > 0 时,进度条始终显示为已满,并且高度未覆盖整个项目,仅覆盖顶部。 不工作

布局xml:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/shadowBackgroundHolder"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/selected_shadow_top_and_bottom" >

    <ProgressBar
        android:id="@+id/progressBar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_margin="0dp"
        android:padding="0dp"
        android:progressDrawable="@drawable/progress_timer" />

    <TextView
        android:id="@+id/currentTime"
        android:layout_width="wrap_content"
        android:layout_height="50dp" />

    <TextView
        android:id="@+id/timer_name"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />

</FrameLayout>

我尝试了不同的东西等,包括进度条最大值,以编程方式和在 xml 中。我尝试使用相对布局(和隐式 z 排序)而不是框架布局,同样的问题。0dp 填充和边距也无关紧要。

有趣的是,当使用 wrap_content 作为宽度时,也会出现同样的问题,尽管会显示一个较短的进度条,但当进度设置为大于 0 时仍然总是填充。在此示例中,其中一个 TextView 的 50dp 高度只是为了清楚地显示截图中的问题,没关系。

其他人能否证实这一点,甚至更好地知道为什么行为不同?更好的是,解决方法或解决方案?

我可以让进度条在 2.x 设备上使用不同的布局完全不涉及使其覆盖整个高度。这是在当前版本的应用程序中,但下一个版本将利用整个项目高度来代替进度。为 2.x 设备选择该解决方案并不是最佳解决方案。

更新:使用 RelativeLayout 的示例,我可以让它覆盖整个高度,但进度总是 full。在进度条元素上使用以下附加属性:

android:layout_alignBottom="@id/content"
android:layout_alignLeft="@id/content"
android:layout_alignTop="@id/content"

在 Android 2.3 设备上,确实是全高度,但如果进度 > 0,进度仍然是满的: 示例问题 2

4

3 回答 3

1

好的,对于我之前的评论,我很抱歉,我查看了我的代码库并发现该错误与 ProgressBar 实现本身有关。

所以我冒险创建了一个扩展TextView但具有ProgressBar外观的视图。随意复制它并根据需要对其进行改进。

import android.widget.TextView;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.Log;

public class ProgressTextView extends TextView {
private float mProgress = 0;
private int progressColor;
private int backgroundColor;
private Paint strokePaint;
private static final String tag = ProgressTextView.class.getSimpleName();

public ProgressTextView(Context context) {
    super(context);
}
public ProgressTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
}
public ProgressTextView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);

}

@Override
public void draw(Canvas canvas) {
        canvas.save();
        setBackgroundColor(progressColor);
        canvas.clipRect(new Rect(0, 0, (int)(getWidth() * mProgress ), getHeight()));
        super.draw(canvas);
        canvas.restore();
        setBackgroundColor(backgroundColor);
        canvas.clipRect(new Rect((int)(getWidth() * mProgress), 0, getWidth(), getHeight()));
        super.draw(canvas);
        Rect rect = canvas.getClipBounds();
        if(strokePaint != null) {
            canvas.drawRect(rect, strokePaint);
        }
        canvas.restore();


}

public void setProgressColor(int color){
    progressColor = color;
}
public void setProgress(int progress) {
    if (progress > 100) {
        return;
    }
    if (mProgress == 0) {
        backgroundColor =Color.GRAY;
    }
    strokePaint = new Paint();
    strokePaint.setColor(progressColor);
    strokePaint.setStrokeWidth(5);
    strokePaint.setStyle(Style.STROKE);
    mProgress    = progress/ (float) 100;
    Log.i(tag, "update progress: " + mProgress);

    invalidate();
}
 }
于 2013-04-16T21:06:12.087 回答
0

我有一个类似的问题。这个进度条现在对我有用:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MoDa" >

<TextView
    android:id="@+id/title"
    style="?textTitle"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/app_name" />

<ProgressBar
    android:id="@+id/progressbar"
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="fill_parent"
    android:layout_height="8dp"
    android:max="100"
    android:visibility="gone" />

<FrameLayout
    android:id="@+id/frame"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_gravity="top|center_horizontal"
    android:orientation="horizontal" >

(更多布局如下)进度条在 TextView 下方是全宽的

希望这可以帮助

于 2013-04-16T19:35:57.423 回答
0

如果使用上面“更新”部分中的版本并且我作弊并在更新进度后添加它,它也可以在 Android 2.x 上“工作”:

if (!Application.hasHoneycomb()) {
    LayoutParams layoutParams = progressBar.getLayoutParams();
    layoutParams.width = ((View) progressBar.getParent()).getWidth() * progressBar.getProgress() / progressBar.getMax();
    progressBar.setLayoutParams(layoutParams);
}

所以进度仍然是满的,只是改变了整个进度条的大小(宽度)。不过,这可能不是很有效……这是一种解决方法,但远非真正的解决方案。

于 2013-04-19T18:41:22.617 回答