2012-09-16 2 views
3

재귀적인 계층 적 레이아웃을 구축 중입니다.재귀 적으로 삽입 된 레이아웃을 최적화하는 방법은 무엇입니까?

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" > 
    <Button 
     android:id="@+id/toggleReplies" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@drawable/button_expand_replies" /> 
    <LinearLayout 
     android:id="@+id/replies" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" > 
    </LinearLayout> 
</RelativeLayout> 

자바 코드에서, 나는이 레이아웃 항목을 팽창하고 응답로를 포함 : 여기 내 message_with_replies.xml이다 (I 명확한 아이디어를 만들기 위해 정렬 속성과 일부 항목을 삭제했습니다) 부모의 레이아웃하고 아이들과 함께이 작업을 반복, 그래서 그들은 나무 형성 : 모든 보이는 내가 최상위 수준 또는 상단에서 2 ~ 3 단계에있을 때 잘 수행

root item 
- child 0 of root 
- - child 0 of child 0 of root 
- - child 1 of child 0 of root 
- - - child 0 of child 1 of child 0 of root 
- child 1 of root 
- child 2 of root 
- child 3 of root 
- - child 0 of child 3 of root 

을하지만, 내가 갈수록 레이아웃은 느리고 느리게 반응합니다. 감속은 비선형이며, 약 7 또는 8의 깊이에서 UI가 완전히 멈 춥니 다 (에뮬레이터는 약 30 분 동안 생각한 후에 예외를 발생시킵니다).

분명히 문제는 삽입 된 레이아웃입니다. 나는 상대적 레이아웃에 선형 레이아웃을 포함 시키므로, 새로운 계층 구조는 UI 레이아웃과 관련하여 두 가지 추가 임베딩을 의미합니다.

최적화하는 방법?

선형 레이아웃을 제거하려고 할 수는 있지만 문제가 해결되지 않을 것으로 예상되지만 더 깊은 레벨로만 지연됩니다. 왜냐하면 여전히 포함시킬 것이기 때문입니다.

다른 레이아웃으로 하위 항목을 부 풀리면 일반적으로 계층 구조를 평평하게 유지할 수 있습니까? 아이템을 부 풀린 다음 콘테이너없이 내용물을 가져갈 수 있습니까?

추가 : 나는이 문제를 해결했습니다. 이제 마진을 사용하여 트리를 만들었으므로 레이아웃이 포함되지 않고 UI가 멈추지 않습니다. 모든 것이 잘 보이고 잘 작동합니다.

그러나 원래 질문은 아직 답변되지 않았습니다.

+0

*와 함께 제공되는 평면 뷰 계층 구조는 실제로 원래 질문에 대한 유효한 대답입니다. 원래의 질문은 "나는이 매우 비싼 작업을 수행하고 있는데 어떻게 최적화 할 수 있습니까?"라고 바꿔 말할 수 있습니다. 때로는 정답은 "일을 덜하십시오"입니다. 너무 많은 레이아웃 레이어를 사용하면 Android에서 항상 비용이 많이 듭니다. – kabuko

답변

3

모든 외모와 나는 최상위 수준 또는 상단에서 약 2 ~ 3 수준에있을 때 잘 수행하지만, 내가 더 깊게로, 레이아웃은 가 느린 속도가 느린 응답합니다. 감속은 비선형이며 깊이가 인 경우 약 7 또는 8에서 UI가 완전히 멈 춥니 다 (에뮬레이터는 약 30 분 동안 생각한 후에 예외를 발생시킵니다).

이미 본 것처럼 문제는 레이아웃 파일의 부서입니다. message_with_replies.xml을 부풀려서 LinearLayout에 추가 할 때마다 레이아웃 부서가 2 씩 증가하므로 성능이 저하됩니다. 그래서, 7-8 레벨로 올라갈 때까지는 권장 된 최대 레이아웃 부서 (실수하지 않으면 10 개)를 이미 훨씬 초과했을 것입니다.

최적화 방법

오래된보기로 레이아웃을 계속 팽창 시키려면 많이하지 않아도됩니다. 그렇지 않으면 여분의 ViewGroups 사이에 마스터 레이아웃에보기를 추가합니다.

하위 항목을 다른 레이아웃으로 부 풀릴 때 일반적으로 계층 구조를 평평하게 유지할 수 있습니까?항목을 부 풀린 다음 내용을 컨테이너없이 가져갈 수 있습니까?

Views 만 레이아웃에 추가하면 계층 구조가 평평하게 유지됩니다. 코드에서와 같이 ViewGroupsViewGroups에 추가하는 경우 계층의 부서가 증가합니다. 불필요한 ViewGroups (일부 경우)을 추가하지 않으려면 merge 태그 (자세한 내용은 here을 참조하십시오)를 사용하는 것이 좋습니다.

추가 : 문제를 해결했습니다. 이제 마진을 사용하여 트리를 만들고, 레이아웃이 포함되지 않고 UI가 고정되지 않습니다. 모든 것 가 보이고 잘 작동합니다.

훨씬 간단한 솔루션이므로 레이아웃을 반복해서 팽창시키는 대신 첫 번째 옵션이 있어야합니다. 레이아웃은 LinearLayout (또는 RelativeLayout, 레이아웃에서 레이아웃 속성을 제거 할 때 알 수 없음) orientationvertical으로 설정하여 얻을 수 있습니다. 이 레이아웃에 원하는 뷰를 추가하고이 아이가 원하는 수준에 따라 여백을 추가 할 수 있습니다.

<merge> 
    <Button android:id="@+id/toggleReplies"> 
    <!-- content of the replies at this level --> 
</merge> 

이 레이아웃을 팽창 후에는 것 : 당신이 더 많은 일을 단순화하려는 경우 (레이아웃으로부터 ButtonLinearLayout 위에로 설정되어있는 경우이 작동) 다음과 같은 레이아웃 파일을 만들 것 패딩을 설정해야합니다 (첫 번째 수준은 x 패딩, 두 번째 수준은 2x, 세 번째 수준은 3x 등). LinearLayout에 추가합니다.

+0

글쎄, '진정한'패딩은 아이들 사이에 연결 선을 그려야하기 때문에 필요하지 않습니다. 그래서 레이아웃의 일부 이미지를 항목의 왼쪽에 삽입하여 패딩을 만듭니다. 하지만 일반적인 생각은 분명합니다. 감사합니다. 그래서 내 마지막 해결책은 올바른 것 (그리고 유일하게 가능) 인 것 같습니다. –

관련 문제