UI ของ Android สร้างขึ้นจาก Views และในแอปพลิเคชันทั่วไป มักจะมีหลายส่วนด้วยกัน หากต้องการทราบว่าผู้ใช้กำลังดู View ใดอยู่ คุณต้องติดตั้ง Visibility Listeners .
อ่านด้านล่างเพื่อค้นหาตัวเลือกต่างๆ ที่คุณต้องระบุสถานะการมองเห็นของข้อมูลพร็อพเพอร์ตี้
วิธีทำให้มองเห็นได้
เพื่อให้ผู้ฟังของเราทำงานได้ อันดับแรกเราต้องตรวจสอบให้แน่ใจว่าพบมุมมองของเราในลำดับชั้นของเลย์เอาต์ สิ่งนี้เกิดขึ้นได้สองวิธี:
- มุมมองของคุณเป็นส่วนหนึ่งของการออกแบบอยู่แล้วตามที่กำหนดไว้ในไฟล์ XML
- คุณสร้างมุมมองแบบไดนามิก และคุณต้องเพิ่มโดยใช้เมธอด addView
public void addView (View child, ViewGroup.LayoutParams params)
สถานะการมองเห็นของ View เป็นประเภทจำนวนเต็มและสามารถมีหนึ่งในสามตัวเลือก:
- มองเห็นได้ (0) - มุมมองจะปรากฏแก่ผู้ใช้
- มองไม่เห็น (4) - ผู้ใช้จะมองไม่เห็นมุมมอง แต่ยังคงใช้พื้นที่ในเลย์เอาต์
- หายไป (8) - มุมมองจะมองไม่เห็น และไม่กินพื้นที่ในเลย์เอาต์
เมื่ออยู่ในลำดับชั้นของเลย์เอาต์แล้ว จะมีตัวเลือกเนทีฟสองสามตัวที่จะช่วยให้เราทราบเมื่อการมองเห็นของมุมมองเปลี่ยนไป
onVisibilityChanged
protected void onVisibilityChanged (View changedView, int visibility)
วิธีนี้จะเกิดขึ้นเมื่อการมองเห็นของมุมมองหรือบรรพบุรุษของมุมมองเปลี่ยนไป สถานะของการมองเห็นอยู่ในพารามิเตอร์การมองเห็น
onWindowVisibilityChanged
protected void onWindowVisibilityChanged (int visibility)
วิธีการนี้จะถูกเรียกใช้เมื่อหน้าต่างที่มีในมุมมองของเราเปลี่ยนการมองเห็น ไม่รับประกันว่าผู้ใช้จะมองเห็นหน้าต่างมุมมองของคุณ เนื่องจากหน้าต่างอื่นอาจถูกบดบังไว้ได้
Visibility Listeners In Action
หากต้องการดูการทำงานของผู้ฟังสองคนนี้ ให้เราสร้างโครงการง่ายๆ เราจะมี LinearLayout พร้อม TextView และปุ่ม เราจะให้การทำงานของปุ่มเมื่อคลิกเพิ่มมุมมองที่กำหนดเองลงในเลย์เอาต์
มุมมองที่กำหนดเองของเรา:
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);
}
});
}
}
เมื่อเราเรียกใช้แอปพลิเคชันและกดปุ่ม เราจะได้รับ:
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)
ทำให้แน่ใจว่าผู้ฟังจะถูกเรียกเพียงครั้งเดียว หากคุณต้องการฟังการเปลี่ยนแปลงต่อ ให้นำออก
หากคุณมีความคิดเห็นหรือข้อเสนอแนะ โปรดแจ้งให้เราทราบ