Computer >> Máy Tính >  >> Hệ thống >> Android

Cách và lý do sử dụng Trình nghe mức độ hiển thị của Android

Giao diện người dùng Android được xây dựng từ Chế độ xem và trong một ứng dụng thông thường, thường có một số giao diện người dùng trong số đó. Để biết người dùng hiện đang xem Chế độ xem nào, bạn cần cài đặt Trình nghe hiển thị .

Đọc bên dưới để tìm hiểu về các tùy chọn khác nhau mà bạn có để xác định trạng thái hiển thị của Chế độ xem.

Cách trở nên hiển thị

Để trình nghe của chúng tôi hoạt động, trước tiên chúng tôi phải đảm bảo Chế độ xem của chúng tôi được tìm thấy trong hệ thống phân cấp bố cục. Có hai cách để điều này xảy ra:

  1. Chế độ xem của bạn đã là một phần trong bố cục của bạn vì nó được xác định trong tệp XML
  2. Bạn đã tạo một Chế độ xem động và bạn cần thêm Chế độ xem bằng phương thức addView
public void addView (View child, ViewGroup.LayoutParams params)
con là Chế độ xem bạn muốn thêm và LayoutParams là các tham số bố cục (I.E. width và height)

Trạng thái hiển thị của Chế độ xem thuộc loại Số nguyên và có thể có một trong ba tùy chọn:

  1. CÓ THỂ (0) - Chế độ xem hiển thị cho người dùng
  2. KHÔNG THỂ THIẾU (4) - Chế độ xem ẩn đối với người dùng, nhưng vẫn chiếm không gian trong bố cục
  3. GONE (8) - Chế độ xem ẩn và không chiếm không gian trong bố cục

Khi ở bên trong hệ thống phân cấp bố cục của chúng tôi, có một số tùy chọn gốc để giúp chúng tôi biết khi nào khả năng hiển thị của Chế độ xem của chúng tôi đã thay đổi.

onVisibilityChanged

protected void onVisibilityChanged (View changedView, int visibility)

Phương thức này được kích hoạt khi khả năng hiển thị của chế độ xem hoặc tổ tiên của chế độ xem đã thay đổi. Trạng thái khả năng hiển thị được tìm thấy bên trong thông số khả năng hiển thị.

onWindowVisibilityChanged

protected void onWindowVisibilityChanged (int visibility)

Phương thức này được kích hoạt khi cửa sổ chứa Chế độ xem của chúng tôi đã thay đổi khả năng hiển thị của nó. Điều này không đảm bảo rằng cửa sổ mà Chế độ xem của bạn đang hiển thị cho người dùng, vì nó có thể bị che khuất bởi một cửa sổ khác.

Trình xử lý khả năng hiển thị đang hoạt động

Để xem hai người nghe này đang hoạt động, chúng ta hãy tạo một dự án đơn giản. Chúng ta sẽ có một LinearLayout với một TextView và một nút. Chúng tôi sẽ thực hiện hành động của nút khi nhấp chuột, thêm chế độ xem tùy chỉnh của chúng tôi vào bố cục.

Cách và lý do sử dụng Trình nghe mức độ hiển thị của Android

Chế độ xem tùy chỉnh của chúng tôi:

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);
    }

}

Và cuối cùng, mã trong MainActivity của chúng tôi:

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);
            }
        });
    }
}
Chúng tôi đính kèm Trình xử lý OnClick vào nút

Khi chúng tôi chạy ứng dụng và nhấn nút, chúng tôi nhận được:

https://giphy.com/gifs/8JZA6Djt7DmYpEXj2h/html5

Bạn có thể lấy dự án mẫu tại đây.

ViewTreeObserver

Đây là một đối tượng gốc có nhiều người nghe được thông báo về các thay đổi khả năng hiển thị khác nhau đối với cây chế độ xem. Một số điểm nổi bật cần lưu ý là:

  • OnGlobalLayoutListener
  • OnWindowAttachListener
  • OnWindowFocusChangeListener

Để đính kèm ViewTreeObserver, bạn cần thực hiện như sau:

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 yêu cầu API> 15

Dòng linearLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this) đảm bảo rằng người nghe sẽ chỉ được gọi một lần. Nếu bạn muốn tiếp tục theo dõi các thay đổi, hãy xóa nó.

Nếu bạn có bất kỳ nhận xét hoặc đề xuất nào, vui lòng cho tôi biết.