Computer >> คอมพิวเตอร์ >  >> ระบบ >> Android

อย่างไรและทำไมจึงต้องใช้ Android Visibility Listeners

UI ของ Android สร้างขึ้นจาก Views และในแอปพลิเคชันทั่วไป มักจะมีหลายส่วนด้วยกัน หากต้องการทราบว่าผู้ใช้กำลังดู View ใดอยู่ คุณต้องติดตั้ง Visibility Listeners .

อ่านด้านล่างเพื่อค้นหาตัวเลือกต่างๆ ที่คุณต้องระบุสถานะการมองเห็นของข้อมูลพร็อพเพอร์ตี้

วิธีทำให้มองเห็นได้

เพื่อให้ผู้ฟังของเราทำงานได้ อันดับแรกเราต้องตรวจสอบให้แน่ใจว่าพบมุมมองของเราในลำดับชั้นของเลย์เอาต์ สิ่งนี้เกิดขึ้นได้สองวิธี:

  1. มุมมองของคุณเป็นส่วนหนึ่งของการออกแบบอยู่แล้วตามที่กำหนดไว้ในไฟล์ XML
  2. คุณสร้างมุมมองแบบไดนามิก และคุณต้องเพิ่มโดยใช้เมธอด addView
public void addView (View child, ViewGroup.LayoutParams params)
ลูกคือมุมมองที่คุณต้องการเพิ่ม และ LayoutParams คือพารามิเตอร์เค้าโครง (ความกว้างและความสูง IE)

สถานะการมองเห็นของ View เป็นประเภทจำนวนเต็มและสามารถมีหนึ่งในสามตัวเลือก:

  1. มองเห็นได้ (0) - มุมมองจะปรากฏแก่ผู้ใช้
  2. มองไม่เห็น (4) - ผู้ใช้จะมองไม่เห็นมุมมอง แต่ยังคงใช้พื้นที่ในเลย์เอาต์
  3. หายไป (8) - มุมมองจะมองไม่เห็น และไม่กินพื้นที่ในเลย์เอาต์

เมื่ออยู่ในลำดับชั้นของเลย์เอาต์แล้ว จะมีตัวเลือกเนทีฟสองสามตัวที่จะช่วยให้เราทราบเมื่อการมองเห็นของมุมมองเปลี่ยนไป

onVisibilityChanged

protected void onVisibilityChanged (View changedView, int visibility)

วิธีนี้จะเกิดขึ้นเมื่อการมองเห็นของมุมมองหรือบรรพบุรุษของมุมมองเปลี่ยนไป สถานะของการมองเห็นอยู่ในพารามิเตอร์การมองเห็น

onWindowVisibilityChanged

protected void onWindowVisibilityChanged (int visibility)

วิธีการนี้จะถูกเรียกใช้เมื่อหน้าต่างที่มีในมุมมองของเราเปลี่ยนการมองเห็น ไม่รับประกันว่าผู้ใช้จะมองเห็นหน้าต่างมุมมองของคุณ เนื่องจากหน้าต่างอื่นอาจถูกบดบังไว้ได้

Visibility Listeners In Action

หากต้องการดูการทำงานของผู้ฟังสองคนนี้ ให้เราสร้างโครงการง่ายๆ เราจะมี LinearLayout พร้อม TextView และปุ่ม เราจะให้การทำงานของปุ่มเมื่อคลิกเพิ่มมุมมองที่กำหนดเองลงในเลย์เอาต์

อย่างไรและทำไมจึงต้องใช้ 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);
    }

}

และสุดท้ายคือรหัสในกิจกรรมหลักของเรา:

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 Listener กับปุ่ม

เมื่อเราเรียกใช้แอปพลิเคชันและกดปุ่ม เราจะได้รับ:

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) ทำให้แน่ใจว่าผู้ฟังจะถูกเรียกเพียงครั้งเดียว หากคุณต้องการฟังการเปลี่ยนแปลงต่อ ให้นำออก

หากคุณมีความคิดเห็นหรือข้อเสนอแนะ โปรดแจ้งให้เราทราบ