source

Android - 보기 안에 어린이를 넣습니까?

ittop 2023. 8. 15. 11:45
반응형

Android - 보기 안에 어린이를 넣습니까?

특정 보기에서 하위 보기를 가져오려면 어떻게 해야 합니까?

그래서 나는 사용자 정의 보기를 가지고 있고 디버거는 그것을 아래에 표시합니다.mChildren7개의 다른 뷰가 있습니다.이러한 뷰에 액세스할 수 있는 방법이 필요하지만 이를 위한 공개 API가 없는 것 같습니다.

좋은 의견이라도 있나?

편집:

사용자 정의 보기 상속 대상AdapterView

for(int index = 0; index < ((ViewGroup) viewGroup).getChildCount(); index++) {
    View nextChild = ((ViewGroup) viewGroup).getChildAt(index);
}

그것으로 충분합니까?

모든 직접 자녀뿐만 아니라 모든 자녀의 자녀 등을 얻고자 하는 경우에는 재귀적으로 이 작업을 수행해야 합니다.

private ArrayList<View> getAllChildren(View v) {

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

    ArrayList<View> result = new ArrayList<View>();

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

        View child = vg.getChildAt(i);

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

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

결과를 사용하려면 다음과 같은 작업을 수행할 수 있습니다.

    // check if a child is set to a specific String
    View myTopView;
    String toSearchFor = "Search me";
    boolean found = false;
    ArrayList<View> allViewsWithinMyTopView = getAllChildren(myTopView);
    for (View child : allViewsWithinMyTopView) {
        if (child instanceof TextView) {
            TextView childTextView = (TextView) child;
            if (TextUtils.equals(childTextView.getText().toString(), toSearchFor)) {
                found = true;
            }
        }
    }
    if (!found) {
        fail("Text '" + toSearchFor + "' not found within TopView");
    }

보기를 통해 언제든지 하위 보기에 액세스할 수 있습니다.findViewById() http://developer.android.com/reference/android/view/View.html#findViewById(int) .

예를 들어, 활동/보기 내에서:

...
private void init() {
  View child1 = findViewById(R.id.child1);
}
...

또는 보기에 대한 참조가 있는 경우:

...
private void init(View root) {
  View child2 = root.findViewById(R.id.child2);
}

저는 이 답변을 대안으로 제시할 것입니다. @모든 자식을 검색하기 위한 IHeartAndroid의 재귀 알고리즘View보기 계층 구조에서 s.이 문서를 작성할 때 재귀 솔루션은 결과에 중복이 포함된다는 점에서 결함이 있습니다.

재귀에 머리를 싸매는 데 어려움을 겪는 사람들을 위해, 여기 비재귀적인 대안이 있습니다.이것이 재귀적 솔루션의 깊이 우선 접근 방식에 대한 폭 우선 검색 대안이라는 점을 인식하면 보너스 점수를 얻을 수 있습니다.

private List<View> getAllChildrenBFS(View v) {
    List<View> visited = new ArrayList<View>();
    List<View> unvisited = new ArrayList<View>();
    unvisited.add(v);

    while (!unvisited.isEmpty()) {
        View child = unvisited.remove(0);
        visited.add(child);
        if (!(child instanceof ViewGroup)) continue;
        ViewGroup group = (ViewGroup) child;
        final int childCount = group.getChildCount();
        for (int i=0; i<childCount; i++) unvisited.add(group.getChildAt(i));
    }

    return visited;
}

몇 가지 간단한 테스트(공식적인 테스트는 아님)를 통해 이 대안이 더 빠르다는 것을 알 수 있습니다. 하지만 이는 새 모델의 수와 관련이 있습니다.ArrayList다른 응답이 생성하는 인스턴스입니다.또한 보기 계층 구조의 수직/수평에 따라 결과가 달라질 수 있습니다.

크로스 포스트 원본: Android | View Group의 모든 하위 요소 가져오기

여기 제안이 있습니다: 당신은 다음을 얻을 수 있습니다.ID(예: 에 의해 지정됨)android:id="@+id/..My Str..)에 의해 생성된R지정된 이름(예:My Str) 를 사용하는 코드 조각입니다.getIdentifier()방법은 다음과 같습니다.

public int getIdAssignedByR(Context pContext, String pIdString)
{
    // Get the Context's Resources and Package Name
    Resources resources = pContext.getResources();
    String packageName  = pContext.getPackageName();

    // Determine the result and return it
    int result = resources.getIdentifier(pIdString, "id", packageName);
    return result;
}

안에서Activity와 결합된 용법의 예.findViewById다음과 같습니다.

// Get the View (e.g. a TextView) which has the Layout ID of "UserInput"
int rID = getIdAssignedByR(this, "UserInput")
TextView userTextView = (TextView) findViewById(rID);

2018년 이후 이 질문을 접한 사람들을 위한 업데이트로, 코틀린을 사용하는 경우 안드로이드 KTX 확장 속성 ViewGroup.children을 사용하여 View의 직계 자녀 순서를 확인할 수 있습니다.

이 방법은 레이아웃 내의 모든 뷰를 사용하며, 이는 알렉산더 쿨랴크틴의 답변과 유사합니다.차이점은 모든 유형의 부모 레이아웃을 허용하고 보기의 배열 목록을 반환한다는 것입니다.

public List<View> getAllViews(ViewGroup layout){
        List<View> views = new ArrayList<>();
        for(int i =0; i< layout.getChildCount(); i++){
            views.add(layout.getChildAt(i));
        }
        return views;
}

테이블 레이아웃(TableLayout)을 새로 고치기 위해서는 위에서 언급한 재귀적 접근 방식을 사용하여 모든 아이들의 자녀 등을 확보해야 했습니다.

LinearLayout과 TableLayout과 같은 클래스만 작업하면 되었기 때문에 상황이 다소 단순해졌습니다.그리고 저는 오직 TextView 아이들을 찾는 것에만 관심이 있었습니다.하지만 저는 이 질문에 여전히 적용 가능하다고 생각합니다.

마지막 클래스는 별도의 스레드로 실행됩니다. 즉, 자식을 위해 구문 분석하기 전에 백그라운드에서 다른 작업을 수행할 수 있습니다.코드는 작고 단순하며 github: https://github.com/jkincali/Android-LinearLayout-Parser 에서 찾을 수 있습니다.

언급URL : https://stackoverflow.com/questions/8395168/android-get-children-inside-a-view

반응형