Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

cannot process visibility of indirect children of ProgressActivity #16

Open
ProgrammerAnthony opened this issue Nov 9, 2016 · 0 comments

Comments

@ProgrammerAnthony
Copy link

ProgrammerAnthony commented Nov 9, 2016

I just meet with this problem and I give out some ways to solve this problem.FYI

in your sourcecode you use this code

`

public void addView(@NonNull View child, int index, ViewGroup.LayoutParams params) {

    super.addView(child, index, params);
    if (child.getTag() == null || (!child.getTag().equals(TAG_LOADING) &&
            !child.getTag().equals(TAG_EMPTY) && !child.getTag().equals(TAG_ERROR))) {
        contentViews.add(child);
    }

}

`

and process the visibility every time we change to different state.
`

private void setContentVisibility(boolean visible, List<Integer> skipIds) {

    for (View v : contentViews) {
        if (!skipIds.contains(v.getId())) {
            v.setVisibility(visible ? View.VISIBLE : View.GONE);
        }
    }

}

`

which means you will only process the view component in
List<View> contentViews = new ArrayList<>();

but the addView method will not add the child views of a child viewgroup .which means a ImageView is inside a RelativeLayout,and the RelativeLayout is a child of ProgressActivity . In this context ,the ImageView will not be add to the contentViews instance .

so I made some changes

`

public void addView(@NonNull View child, int index, ViewGroup.LayoutParams params) {

    super.addView(child, index, params);
    if (child.getTag() == null || (!child.getTag().equals(TAG_LOADING) &&
            !child.getTag().equals(TAG_EMPTY) && !child.getTag().equals(TAG_ERROR))) {
         //            contentViews.add(child);
        contentViews.addAll(getAllChildren(child));
        Log.i("ProgressActivity", "sub children count of ProgressActivity is" + contentViews.size());
    }

}


/**
 * save all of the direct and  indirect children views
 *
 * @param
 */
private List<View> getAllChildren(View v) {

    if (!(v instanceof ViewGroup)) {
        List<View> viewArrayList = new ArrayList<>();
        viewArrayList.add(v);
        return viewArrayList;
    } else {
        if (((ViewGroup) v).getChildCount() == 0) {
            List<View> viewArrayList = new ArrayList<>();
            viewArrayList.add(v);
            return viewArrayList;
        } else {
            List<View> result = new ArrayList<>();

            ViewGroup vg = (ViewGroup) v;
            for (int i = 0; i < vg.getChildCount(); i++) {

                View child = vg.getChildAt(i);

                List<View> viewArrayList = new ArrayList<>();
                viewArrayList.add(v);
                viewArrayList.addAll(getAllChildren(child));

                result.addAll(viewArrayList);
            }
            return result;
        }
    }
}`

now the instance of contentViews includes all of the chilrend and grandson ....component.

one more changes is needed:
`

 /**
   * set children visibility of StatusLayout
    *
   * @param visible
    * @param skipIds
   */
private void setContentVisibility(boolean visible, List<Integer> skipIds) {
    for (View v : contentViews) {
        if (!skipIds.contains(v.getId())) {
            v.setVisibility(visible ? View.VISIBLE : View.INVISIBLE);
        }
        // when visible is true,which means set content Layout, the skipIds compoent need to be hide
        if (visible) {
            if (skipIds.contains(v.getId())) {
                v.setVisibility(View.INVISIBLE);
            }
        }
        //set parent to be visible when child want to be visible
        if (v.getVisibility() == View.VISIBLE) {
            setParentToVisible(v);
        }
    }
}

`

`

public void setParentToVisible(View v) {
    ViewParent mParent = v.getParent();
    if (mParent != null && mParent instanceof ViewGroup) {
        ((ViewGroup) mParent).setVisibility(View.VISIBLE);
        if (mParent.getParent() != null) {
            setParentToVisible((View) mParent);
        }
    }

}

`

the part of code which I add .means the example ImageView I told in this issue before if i skip to hide it .I needed to set it to visible .but at the same time ,we need to set its parent to be visible ,which is the RelativeLayout -the child of ProgressActivity.

For anyone who meet with this problem's recommendation.

ProgrammerAnthony added a commit to ProgrammerAnthony/Haafiz that referenced this issue Nov 9, 2016
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant