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 より大きい値に設定されている場合は常に塗りつぶされます。スクリーンショットの問題、それは問題ではありません。

他の誰かがこれを確認できますか、それとも動作が異なる理由について何か考えがありますか? さらに良いことに、回避策または解決策はありますか?

高さ全体をカバーすることを含まない別のレイアウトを使用して、プログレスバーを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

上記の「更新」セクションのバージョンを使用し、進行状況の更新後にチートしてこれを追加すると、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 に答える
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 に答える