如何在Android屏幕上检查视图是否真的可见?

时间:2016-02-29 03:57:24

标签: android android-layout

ScrollView的许多示例,但我对RelativeLayout没有任何想法

在RelativeLayout中,一些视图将涵盖另一个视图。 我可以用xml检查它,但如何用java代码检查呢? 使用isShown(),willNotDraw(),hasWindowFocus(),getLocalVisibleRect(),这些都不起作用。

案例1:容器布局确实在屏幕上

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!--container layout is really on screen-->
    <fragment
        android:id="@+id/map_fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />

    <LinearLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        >
        <ImageView
            android:id="@+id/icon"
            android:layout_width="50dp"
            android:layout_height="50dp"
            />
        <TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="18sp"
            />
        </LinearLayout>
    </LinearLayout>
</RelativeLayout>

案例2:容器布局并非真正在屏幕上

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        >
        <ImageView
            android:id="@+id/icon"
            android:layout_width="50dp"
            android:layout_height="50dp"
            />
        <TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="18sp"
            />
        </LinearLayout>
    </LinearLayout>

    <!--container layout is not really on screen-->
    <fragment
        android:id="@+id/map_fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />
</RelativeLayout>

2 个答案:

答案 0 :(得分:1)

尝试使用此

   if (myView.isShown()) {
        // Its visible
    } else {
        // Either gone or invisible
    }

答案 1 :(得分:0)

案例2中的更改:容器布局实际上不在屏幕上

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/parent"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <ImageView
            android:id="@+id/icon"
            android:layout_width="50dp"
            android:layout_height="50dp" />

        <TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="18sp" />
    </LinearLayout>

    <!--container layout is not really on screen-->
    <FrameLayout
        android:id="@+id/frameLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <!-- fragment -->
    </FrameLayout>

</RelativeLayout>

<强> MainActivity

public class MainActivity extends AppCompatActivity {

    private static final String TAG = MainActivity.class.getSimpleName();
    private FrameLayout frameLayout;
    private LinearLayout container;
    private RelativeLayout parent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        frameLayout = (FrameLayout) findViewById(R.id.frameLayout);
        container = (LinearLayout) findViewById(R.id.container);
        parent = (RelativeLayout) findViewById(R.id.parent);

        //container.bringToFront();
        Log.e(TAG, "container: " + parent.indexOfChild(container));
        Log.e(TAG, "frameLayout: " + parent.indexOfChild(frameLayout));

        if (parent.indexOfChild(container) == parent.getChildCount() - 1) {
            Log.e(TAG, "container is visible");
        } else {
            Log.e(TAG, "container is not visible");
        }
    }
}

如果容器索引等于父级中的子计数,则它位于其他视图的前面并且可见。否则容器重叠在其他布局后面。

我希望它对你有所帮助。