【问题标题】:addView not visible in custom FrameLayout but clickableaddView 在自定义 FrameLayout 中不可见但可点击
【发布时间】:2013-07-25 17:31:40
【问题描述】:

我想创建一个相对通用的 ViewGroup 容器,让它在加载任务准备好时切换到进度条并再次隐藏(+切换到内容)。这应该易于使用并且适合大多数(不是所有)情况。

我知道这个问题可能已经被问过好几次了,但是在研究了 4-5 个小时后我找不到合适的解决方案。

什么不起作用? 进度条根本不显示。我尝试了 Visibility 并以多种方式删除/添加所有视图。它根本没有出现。如果您调用 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

【问题讨论】:

    标签: java android android-layout layout android-framelayout


    【解决方案1】:

    与其创建自己的自定义视图来切换视图,不如使用ViewSwitcher 来代替?

    它的工作方式是在 viewSwitcher 中放置 2 个视图,一个可能是 progressBar(或包含它的布局,也可能是一个 textView),另一个是内容本身。

    当你准备好切换时,你可以使用 viewSwitcher.showNext() 。

    为了确保显示正确的视图,您可以检查从 getCurrentView() 返回的内容。

    【讨论】:

    • 绝对是一个想法,没想到。一定会尝试并报告。
    • 是的,它甚至可以按照您的计划从 FrameLayout 扩展... :) 您还可以在过渡之间设置动画。
    • 感谢您的精彩提示。它完美无缺。 (最终解决方案:pastebin.com/2xjnCDLS
    • 我猜“最后一件事”是在 xml 中实例化进度条,而不是以编程方式设置它。
    • 我不明白最后的评论,但很高兴我能帮助你一点。
    猜你喜欢
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多