gpt4 book ai didi

java - addView 在自定义 FrameLayout 中不可见但可点击

转载 作者:行者123 更新时间:2023-11-29 09:00:18 25 4
gpt4 key购买 nike

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

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

什么不起作用?进度条根本不显示。我尝试使用可见性并以多种方式删除/添加所有 View 。它根本没有出现。如果您调用 hideProgressBar() 子项(在 xml 中指定),例如一个 ListView ,显示得很好。只是 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

最佳答案

为什么不使用 ViewSwitcher 而不是仅仅为了切换 View 而创建自己的自定义 View 呢?相反?

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

当您准备好进行切换时,您可以使用 viewSwitcher。 showNext () 。

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

关于java - addView 在自定义 FrameLayout 中不可见但可点击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17864896/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com