Computer >> 컴퓨터 >  >> 체계 >> Android

Android Visibility Listeners를 사용하는 방법과 이유

Android UI는 View로 구성되며 일반 응용 프로그램에는 일반적으로 몇 가지가 있습니다. 사용자가 현재 보고 있는 View를 확인하려면 Visibility Listeners를 설치해야 합니다. .

보기의 가시성 상태를 식별하는 데 필요한 다양한 옵션에 대해 알아보려면 아래를 읽어보세요.

보이게 되는 방법

리스너가 작동하려면 먼저 레이아웃 계층에서 View가 있는지 확인해야 합니다. 두 가지 방법이 있습니다.

  1. 보기는 XML 파일에 정의되어 있으므로 이미 레이아웃의 일부입니다.
  2. 보기를 동적으로 생성했으며 addView 메소드를 사용하여 추가해야 합니다.
public void addView (View child, ViewGroup.LayoutParams params)
child는 추가하려는 View이고 LayoutParams는 레이아웃 매개변수(예:너비 및 높이)입니다.

보기의 가시성 상태는 정수 유형이며 세 가지 옵션 중 하나를 가질 수 있습니다.

  1. 보임(0) - 사용자가 보기를 볼 수 있습니다.
  2. 보이지 않음(4) - 보기는 사용자에게 보이지 않지만 여전히 레이아웃에서 공간을 차지합니다.
  3. 사라짐(8) - 보기가 보이지 않으며 레이아웃에서 공간을 차지하지 않습니다.

레이아웃 계층 구조 내부에는 View의 가시성이 변경된 시점을 알려주는 몇 가지 기본 옵션이 있습니다.

onVisibilityChanged

protected void onVisibilityChanged (View changedView, int visibility)

이 메서드는 보기 또는 보기의 상위 항목의 가시성이 변경되었을 때 트리거됩니다. 가시성 상태는 가시성 매개변수 내에서 찾을 수 있습니다.

onWindowVisibilityChanged

protected void onWindowVisibilityChanged (int visibility)

이 메서드는 View의 포함 창이 가시성을 변경했을 때 트리거됩니다. 다른 창에 의해 가려질 수 있으므로 보기가 있는 창이 사용자에게 표시된다는 보장은 없습니다.

가시성 리스너 실행

이 두 리스너가 작동하는 모습을 보기 위해 간단한 프로젝트를 만들어 보겠습니다. TextView와 버튼이 있는 LinearLayout이 있습니다. 버튼 동작 시 레이아웃에 사용자 정의 보기를 추가하도록 하겠습니다.

Android Visibility Listeners를 사용하는 방법과 이유

사용자 정의 보기:

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);
            }
        });
    }
}
버튼에 OnClick 리스너를 연결합니다.

애플리케이션을 실행하고 버튼을 누르면 다음과 같은 결과가 나타납니다.

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
    } 
});
removeOnGlobalLayoutListener에는 API> 15가 필요합니다.

linearLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this) 리스너가 한 번만 호출되도록 합니다. 변경 사항을 계속 듣고 싶다면 제거하십시오.

의견이나 제안 사항이 있으면 언제든지 알려주십시오.