2

ロードタスクの準備ができたら、比較的一般的なViewGroupコンテナを作成して、プログレスバーに切り替えて再び非表示にする(+コンテンツに切り替える)ことを望みました。これは使いやすく、ほとんどの (すべてではない) ケースに適合するはずです。

これは何度か尋ねられたかもしれませんが、これに4〜5時間取り組んだ後、適切な解決策を見つけることができませんでした.

何が機能しないのですか? プログレスバーはまったく表示されません。可視性といくつかの方法ですべてのビューを削除/追加してみました。それは単に現れません。hideProgressBar() を呼び出すと、リストビューなどの子 (xml で指定) が完全に正常に表示されます。ProgressBar だけが見えないようです。ただし、プログレスバーはクリック可能です。

何か案は?

ソースは次のとおりです。

public class ProgressBarContainer extends FrameLayout {

    private static final int DEFAULT_PROGRESSBAR_STYLE = android.R.style.Widget_Holo_Light_ProgressBar_Large;

    private boolean isIndeterminate = true; // default is true
    private int mProgressBarStyle = DEFAULT_PROGRESSBAR_STYLE;

    private ProgressBar mProgressBar;

    private List<View> childCache = new ArrayList<View>();

    public ProgressBarContainer(Context context) {
        super(context);
    }

    public ProgressBarContainer(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(attrs);
    }

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

    /**
     * Shows the ProgressBar and hides all "Content" Views
     */
    public void showProgressBar() {
        pushBackChilds();
        //
        // mProgressBar.setVisibility(View.VISIBLE);
        // mProgressBar.bringToFront();
        // setContentVisibility(View.INVISIBLE);

    }

    private void pushBackChilds() {
        for (int i = 0; i < getChildCount(); i++) {
            View child = this.getChildAt(i);
            if (child != mProgressBar) {
                childCache.add(child);
                removeView(child);
            } else {
                Logging.d("ProgressBarContainer", "is ProgressBar at" + i);
            }
        }

        addView(mProgressBar);
    }

    /**
     * Hides the ProgressBar and shows all "Content" Views
     */
    public void hideProgressBar() {
        // mProgressBar.setVisibility(View.INVISIBLE);
        //
        // setContentVisibility(View.VISIBLE);
        rescueChilds();

    }

    private void rescueChilds() {

        removeView(mProgressBar);
        for (View child : childCache) {
            if (child != null) {
                this.addView(child);
            }
        }
    }

    /**
     * Changes visibility of all content except the ProgressBar
     * 
     * @param visibility
     */
    public void setContentVisibility(int visibility) {
        for (int i = 0; i < getChildCount(); i++) {
            View child = this.getChildAt(i);
            if (child != mProgressBar) {
                child.setVisibility(visibility);
            } else {
                Logging.d("ProgressBarContainer", "is ProgressBar at" + i);
            }
        }
    }

    public ProgressBar getProgressBar() {
        return mProgressBar;
    }

    private void init(AttributeSet attrs) {
        // get styleables
        TypedArray a = getContext().obtainStyledAttributes(attrs,
                R.styleable.ProgressBarContainer);
        isIndeterminate = a.getBoolean(
                R.styleable.ProgressBarContainer_isIndeterminate, true);
        mProgressBarStyle = a.getInt(
                R.styleable.ProgressBarContainer_progressBarStyle,
                DEFAULT_PROGRESSBAR_STYLE);

        a.recycle();

        // init progressbar and stuff

        mProgressBar = new ProgressBar(getContext(), null, mProgressBarStyle);
        mProgressBar.setVisibility(ProgressBar.VISIBLE);
        mProgressBar.setIndeterminate(isIndeterminate);

        mProgressBar.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Logging.d("ProgressBar", "Clicked progressbar");

            }
        });

         LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
         lp.gravity = Gravity.CENTER;
         mProgressBar.setLayoutParams(lp);
        // addView(mProgressBar);
    }
}

そして、ここに解決策があります: http://pastebin.com/2xjnCDLS

4

1 に答える 1

0

ビューを切り替えるためだけに独自のカスタム ビューを作成する代わりに、代わりにViewSwitcherを使用してみませんか?

それが機能する方法は、viewSwitcher 内に 2 つのビューを配置することです。1 つはおそらく progressBar (またはそれを保持するレイアウトとおそらく textView) であり、もう 1 つはコンテンツ自体です。

切り替えの準備ができたら、viewSwitcher を使用できます。showNext () .

正しいビューが表示されていることを確認するために、getCurrentView () から何が返されるかを確認できます。

于 2013-07-25T18:28:23.510 に答える