如何检查TextView是否在可见屏幕内(Android)

4

我想知道我的文本视图是否在可见屏幕范围内。

我查看了以下链接:

Android - 获取视图的可见区域? Android:如何检查ScrollView中的View是否可见?

但是似乎都不适用于我。

我用来检查的代码是

    Rect rect = new Rect();
    //textview intialized in onCreate as text1
    text1.getHitRect(rect);
    text1.measure(0, 0); 
    //layout is the parent layout (linear) in which i am adding the text view
    Rect acctualView = new Rect(Math.round(layout.getX()), Math.round(layout.getY()), 
            Math.round(layout.getX() + layout.getWidth()), Math.round(layout.getY()         +layout.getHeight()));

    if(Rect.intersects(acctualView, rect))
    {
        Toast.makeText(context, "visible", Toast.LENGTH_LONG).show();
    }else {
        Toast.makeText(context, "Not visible ", Toast.LENGTH_LONG).show();
    }

每个TextView和布局的宽度和高度都为0,

请告诉我如何修复此问题并确定视图是否在可见区域内

以下是完整的活动代码

public class MainActivity extends Activity {

private TextView text1, text2, text3, text4, text5, text6;
private Context context;
private LinearLayout layout;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    context = getLayoutInflater().getContext();
    layout = (LinearLayout) findViewById(R.id.parentLayout);
    setTextViews();
    checkViewAndUpdate();

}

private void checkViewAndUpdate() {

    Rect rect = new Rect();
    layout.getHitRect(rect);
    if (text1.getLocalVisibleRect(rect)) {
        Toast.makeText(context, "visible", Toast.LENGTH_LONG).show();
    } else {
        Toast.makeText(context, "Not visible", Toast.LENGTH_LONG).show();
    }

}

private void setTextViews() {

    text1 = new TextView(context);
    text2 = new TextView(context);
    text3 = new TextView(context);
    text4 = new TextView(context);
    text5 = new TextView(context);
    text6 = new TextView(context);

    text1.setText("text1");
    text2.setText("text2");
    text3.setText("text3");
    text4.setText("text4");
    text5.setText("text5");
    text6.setText("text6");

    text1.setTextSize(30);
    text2.setTextSize(30);
    text3.setTextSize(30);
    text4.setTextSize(30);
    text5.setTextSize(30);
    text6.setTextSize(30);

    //layout.removeAllViews();

    layout.addView(text1);
    layout.addView(text2);
    layout.addView(text3);
    layout.addView(text4);
    layout.addView(text5);
    layout.addView(text6);

}

而且我的布局只包含 LinearLayout(空的)


你的链接似乎可以工作。你在什么时候/哪里尝试调用 getXXXVisibleRect()?如果你在 onCreate 中这样做,它是无法工作的。 - ytRino
@ytRino,我已经添加了完整的代码,请告诉我如何修复它。 - wizyashas
3个回答

3

正如我在评论中所写的那样,在 onCreate 中检查可见矩形是行不通的。
请尝试在 onCreate 结束时使用以下代码(而不是直接调用 checkAndUpdate())。

 layout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                checkViewAndUpdate();
            }
        });

如果你在onCreate添加了视图,那么视图布局并不会完成。是的,在此期间用户无法看到实际活动,并且视图的实际大小也未设置。
onGlobalLayout将在视图布局结束时调用(并且活动可见)。
在此时,我们现在可以获取它们的大小和位置!

顺便提一下,你可以通过在onGlobalLayout()中调用layout.getViewTreeObserver().removeOnGlobalLayoutListener(this)来删除此侦听器。


谢谢,兄弟。它能用,但我不知道为什么,如果有解释就太好了。 - wizyashas
@wizyashas添加了信息。希望它有所帮助。 - ytRino

2

尝试使用以下方法:

if (yourView.getParent().getVisibility() == View.VISIBLE) {
    // visible
} else{
    // hiden
}

或者是这样:
Rect rect = new Rect();
parentView.getHitRect(rect);
if (imageView.getLocalVisibleRect(rect)) {
    // imageView is within the visible window
} else {
    // imageView is not within the visible window
}

我不明白,textview.getParent().getVisibility 不可用。 - wizyashas
请上传您的XML文件。 - Md. Shahadat Sarker
@md-shahadat-sarker 谢谢您 - wizyashas

0
为什么不使用 for 方法?
for(int i = 0; i < 6; i++){
 TextView tv = new   TextView(context);
 tv.setTextSize(30);
 layout.addView(tv);
 //Maybe set some listeners...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接