Android UI는 View로 구성되며 일반 응용 프로그램에는 일반적으로 몇 가지가 있습니다. 사용자가 현재 보고 있는 View를 확인하려면 Visibility Listeners를 설치해야 합니다. .
보기의 가시성 상태를 식별하는 데 필요한 다양한 옵션에 대해 알아보려면 아래를 읽어보세요.
보이게 되는 방법
리스너가 작동하려면 먼저 레이아웃 계층에서 View가 있는지 확인해야 합니다. 두 가지 방법이 있습니다.
- 보기는 XML 파일에 정의되어 있으므로 이미 레이아웃의 일부입니다.
- 보기를 동적으로 생성했으며 addView 메소드를 사용하여 추가해야 합니다.
public void addView (View child, ViewGroup.LayoutParams params)
보기의 가시성 상태는 정수 유형이며 세 가지 옵션 중 하나를 가질 수 있습니다.
- 보임(0) - 사용자가 보기를 볼 수 있습니다.
- 보이지 않음(4) - 보기는 사용자에게 보이지 않지만 여전히 레이아웃에서 공간을 차지합니다.
- 사라짐(8) - 보기가 보이지 않으며 레이아웃에서 공간을 차지하지 않습니다.
레이아웃 계층 구조 내부에는 View의 가시성이 변경된 시점을 알려주는 몇 가지 기본 옵션이 있습니다.
onVisibilityChanged
protected void onVisibilityChanged (View changedView, int visibility)
이 메서드는 보기 또는 보기의 상위 항목의 가시성이 변경되었을 때 트리거됩니다. 가시성 상태는 가시성 매개변수 내에서 찾을 수 있습니다.
onWindowVisibilityChanged
protected void onWindowVisibilityChanged (int visibility)
이 메서드는 View의 포함 창이 가시성을 변경했을 때 트리거됩니다. 다른 창에 의해 가려질 수 있으므로 보기가 있는 창이 사용자에게 표시된다는 보장은 없습니다.
가시성 리스너 실행
이 두 리스너가 작동하는 모습을 보기 위해 간단한 프로젝트를 만들어 보겠습니다. TextView와 버튼이 있는 LinearLayout이 있습니다. 버튼 동작 시 레이아웃에 사용자 정의 보기를 추가하도록 하겠습니다.
사용자 정의 보기:
package com.tomerpacific.viewvisibility;
import android.content.Context;
import android.graphics.Color;
import android.util.Log;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import static android.view.Gravity.CENTER;
public class MyCustomView extends LinearLayout {
private final String TAG = MyCustomView.class.getSimpleName();
public MyCustomView(Context context) {
super(context);
this.setBackgroundColor(Color.GREEN);
this.setGravity(CENTER);
TextView myTextView = new TextView(context);
myTextView.setText("My Custom View");
addView(myTextView);
}
@Override
public void onVisibilityChanged(View changedView, int visibility) {
super.onVisibilityChanged(changedView, visibility);
Log.d(TAG, "View " + changedView + " changed visibility to " + visibility);
}
@Override
public void onWindowVisibilityChanged(int visibility) {
super.onWindowVisibilityChanged(visibility);
Log.d(TAG, "Window visibility changed to " + visibility);
}
}
마지막으로 MainActivity의 코드:
package com.tomerpacific.viewvisibility;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
public class MainActivity extends AppCompatActivity {
private Button addCustomViewBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
addCustomViewBtn = (Button) findViewById(R.id.addCustomViewBtn);
addCustomViewBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
LinearLayout mainLayout = (LinearLayout) findViewById(R.id.mainLayout);
MyCustomView myCustomView = new MyCustomView(getApplicationContext());
myCustomView.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
mainLayout.addView(myCustomView);
}
});
}
}
애플리케이션을 실행하고 버튼을 누르면 다음과 같은 결과가 나타납니다.
https://giphy.com/gifs/8JZA6Djt7DmYpEXj2h/html5
여기에서 샘플 프로젝트를 받을 수 있습니다.
ViewTreeObserver
이것은 뷰 트리에 대한 다양한 가시성 변경에 대한 알림을 받는 광범위한 리스너가 있는 기본 개체입니다. 주목해야 할 몇 가지 주요 사항은 다음과 같습니다.
- OnGlobalLayoutListener
- OnWindowAttachListener
- OnWindowFocusChangeListener
ViewTreeObserver를 연결하려면 다음을 수행해야 합니다.
LinearLayout linearLayout = (LinearLayout) findViewById(R.id.YOUR_VIEW_ID);
ViewTreeObserver viewTreeObserver = linearLayout.getViewTreeObserver();
viewTreeObserver.addOnGlobalLayoutListener (new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
linearLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
//TODO Add Logic
}
});
linearLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this)
줄 리스너가 한 번만 호출되도록 합니다. 변경 사항을 계속 듣고 싶다면 제거하십시오.
의견이나 제안 사항이 있으면 언제든지 알려주십시오.