5

問題

私は理解できない奇妙な問題を抱えており、他の目を見る必要があります。ProgressBarビューを動的に作成しましたが、MotorolaXoomを除くさまざまなデバイスとAVDで動作します。


スクリーンショット

すべてのスクリーンショットにはその上にデバイス名があり、超高解像度のために25%であるNexus 10を除いて、ADTを介して取得したものから約50%削減されています。ProgressBarの赤い背景は、デバッグの目的で追加され、ビューがそこにあり、表示されていることを示します。中央に左と上のパディングを追加しました。

以下のスクリーンショットは、Xoomが機能しないところから始まり、Nexus 10(AVD)、Nexus 7、Galaxy Nexus、HTC Droid Incredibleが続き、他のすべての場所で機能していることを示しています。ショットの後に、コードを追加します。

MotorolaXoomが機能しない

プログレスバーが機能しない!ただし、ビューが表示されていることに注意してください(赤い背景が表示されています)。

Motorola Xoom

他のデバイスで正常に動作する

サークルの進行状況は、これらすべてのデバイスで表示されます。

シミュレートされたSamsungNexus10

シミュレートされたSamsungNexus10

ASUS Nexus 7

ASUS Nexus 7

サムスンギャラクシーネクサス

サムスンギャラクシーネクサス

HTC Droid Incredible

HTC Droid Incredible


今コード

これにより、それを含む親ビューが作成されます。

    RelativeLayout discoverListLayout = new RelativeLayout(mContext);
    discoverListLayout.setLayoutParams(params);
    discoverListLayout.addView(mDiscoverList);

mDiscoverListは、最終的に表示されるリストビューです。リストがロードされるまで、ProgressBarがその上にロードされます。

次に、プログレスバーを作成して設定します。オブジェクトの幅と高さが0であるため、パディングonGlobalLayoutを設定します。

    mDiscoverLoading = new ProgressBar(mContext);
    params.height = ViewPager.LayoutParams.WRAP_CONTENT;
    params.width = ViewPager.LayoutParams.WRAP_CONTENT;
    mDiscoverLoading.setLayoutParams(params);
    mDiscoverLoading.setIndeterminate(true);
    discoverListLayout.addView(mDiscoverLoading);
    ViewTreeObserver vto = mDiscoverLoading.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
        @SuppressWarnings("deprecation")
        @Override
        public void onGlobalLayout() {
            if (mDiscoverList.getCount() > 0) {
                processLoadedList(true);
            } else {
                mDiscoverLoading.setBackgroundColor(getActivity().getResources().getColor(R.color.stitchoid_red));
                mDiscoverLoading.setPadding((getView().getWidth() / 2) - (mDiscoverLoading.getWidth() / 2),(getView().getHeight() / 2) - (mDiscoverLoading.getHeight()), 0, 0);
            }
            ViewTreeObserver obs = mDiscoverLoading.getViewTreeObserver();
            obs.removeGlobalOnLayoutListener(this);
        }
    });

つまり、Motorola Xoomを除いて、すべてがチャンピオンのように機能します!?この問題の解決に役立つ洞察や提案をいただければ幸いです。追加情報を提供する必要があるかどうかをお知らせください。

どうもありがとうございます!

*補遺:おそらくあまり関連性がないが念のために注意する奇妙なこと:ProgressBarの幅をmatch_parentに設定した場合(そして幅のパディングを追加しない場合)、他の場所でも機能しますが、Xoomでは表示されますが幅まで引き伸ばされると歪んでしまいます(xoomのみ)。

4

1 に答える 1

6

正直なところ、それがどのように、またはなぜ違いを生むのかわかりません。

ただし、上下のパディングを画面の半分のサイズに手動で設定するのではなく、RelativeLayout.CENTER_IN_PARENTを使用してProgressBarを画面の中央に配置してみてください。

したがって、代わりに:

mDiscoverLoading.setPadding((getView().getWidth() / 2) - (mDiscoverLoading.getWidth() / 2),(getView().getHeight() / 2) - (mDiscoverLoading.getHeight()), 0, 0);

使用する

LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
lp.addRule(RelativeLayout.CENTER_IN_PARENT);
mDiscoverLoading.setLayoutParams(lp); 

LayoutParamsオブジェクトにはいくつかの異なる「バージョン」があることに注意してRelativeLayout.LayoutParamsください。この場合、親はRelativeLayoutであるため、インポートするバージョンであることを確認する必要があります。

Xoomでパディングがバグになる原因はわかりませんが、これはProgressBarを中央に配置する別の方法であり、問​​題の原因となっているバグの影響を受けていないようです。 xoom。

于 2013-02-18T21:23:55.783 に答える