728x90
ViewStub 안드로이드 개발자 공식문서
https://developer.android.com/reference/android/view/ViewStub
ViewStub | Android Developers
developer.android.com
ViewStub은 런타임에 레이아웃 리소스를 지연적으로 인플레이트할 수 있는 보이지 않는 크기가 0인 View입니다. 사용자가 ViewStub을 보이게 하거나 inflate() 메서드를 호출하면, 해당 레이아웃 리소스가 인플레이트되어 ViewStub은 자신을 부모 뷰에서 인플레이트된 View로 대체합니다. 따라서 ViewStub은 setVisibility(int) 또는 inflate()가 호출될 때까지 뷰 계층에 존재하게 됩니다.
ViewStub을 사용하여 레이아웃의 일부를 선택적으로 인플레이트 하는 방법을 사용합니다.
불필요한 레이아웃을 관리하여 효율적으로 관리합니다.
왜 사용할까요?
- 성능 최적화: ViewStub은 기본적으로 UI 트리에 포함되지 않으므로, 메모리 사용량과 성능을 최적화하는 데 도움이 됩니다. 초기 로딩 시 불필요한 뷰를 메모리에 올리지 않아도 되므로 앱의 반응성이 향상됩니다.
- 선택적 UI 요소: 특정 뷰를 사용자의 액션에 따라 동적으로 표시하고자 할 때 유용합니다. 예를 들어, 세부 정보를 보여주거나 추가 정보를 필요할 때만 UI를 업데이트하여 사용자 경험을 개선할 수 있습니다.
- 유지 보수 용이성: 인플레이트된 뷰를 별도로 관리하기 때문에, 코드가 깔끔하고 이해하기 쉬워 유지 보수가 용이합니다.
적용 사례
- 대화형 UI: 사용자의 액션에 따라 UI가 변화해야 할 때, 예를 들어, 상세정보를 보여주는 버튼 클릭 시 추가 정보를 표시하는 경우에 적합합니다.
- 메모리 관리가 중요한 앱: 대량의 데이터를 다루는 앱이나 메모리가 제한된 환경에서는 필요한 UI 요소만 로드하여 메모리 사용량을 줄일 수 있습니다.
- 프로토타입 및 디자인 초기 단계: UI의 특정 요소가 필요할 때만 보여주어야 할 경우, 초기 설계 및 프로토타입 단계에서 유용합니다.
- 복잡한 레이아웃: 복잡한 레이아웃에서 비슷한 UI 요소를 여러 번 사용하는 경우, ViewStub을 통해 필요할 때만 해당 요소를 인플레이트하여 중복 코드를 줄일 수 있습니다.
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/buttonInflate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Inflate ViewStub"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="16dp" />
<ViewStub
android:id="@+id/viewStub"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout="@layout/viewstub_content"
app:layout_constraintTop_toBottomOf="@id/buttonInflate"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
viewstub_content.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ViewStub! 인플레이트가 되었습니다!"
android:textSize="18sp"
android:textColor="#000" />
</LinearLayout>
MainActivity
import android.os.Bundle;
import android.view.View;
import android.view.ViewStub;
import android.widget.Button;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
ViewStub viewStub;
View inflatedView; // 인플레이트된 뷰를 저장할 변수
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button buttonInflate = findViewById(R.id.buttonInflate);
viewStub = findViewById(R.id.viewStub);
buttonInflate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 인플레이트된 뷰가 없으면 인플레이트
if (inflatedView == null) {
inflatedView = viewStub.inflate(); // ViewStub 인플레이트
// Toast 메시지 추가
Toast.makeText(MainActivity.this, "ViewStub이 인플레이트되었습니다!", Toast.LENGTH_SHORT).show();
} else {
// 이미 인플레이트된 경우 메시지
Toast.makeText(MainActivity.this, "ViewStub은 이미 인플레이트되었습니다.", Toast.LENGTH_SHORT).show();
}
}
});
}
}
ViewStub이 한 번만 인플레이트되도록 제어합니다.
이렇게 하면 사용자가 버튼을 여러 번 클릭해도 ViewStub이 반복적으로 인플레이트되지 않도록 합니다.
'안드로이드 자바' 카테고리의 다른 글
[JAVA][Android] ViewTreeObserver 사용 하여 레이아웃 크기 측정과 상태 전환 다루기 (0) | 2024.11.04 |
---|---|
[JAVA][Android]Toast 메시지 위치 변경해 보여주기(1) (0) | 2024.10.30 |
[Java][Android] 토스트(Toast) 메시지 커스텀하기 (2) | 2024.10.27 |
[JAVA][Android] Palette를 사용하여 이미지, 사진 색상 정보 추출하기 (6) | 2024.10.23 |
[JAVA][Android] SwipeRefreshLayout 사용하여 새로고침 기능 구현하기 (2) | 2024.10.21 |