不会从TabHost中调用Android Activity.onWindowFocusChanged

dub*_*ugh 2 android overriding android-tabhost android-activity

我正在努力解决在我的自定义Activity类中没有调用.onWindowFocusChanged()的问题.我的设置:

TabHost中的两个选项卡(包含Activity_1和Activity_2),默认情况下选择第二个选项卡:

tabHost.setCurrentTab(currentTabIndex);
Run Code Online (Sandbox Code Playgroud)

在这两个活动中,我添加了onWindowFocusChanged()覆盖(因为我需要在布局完成绘图后预先形成计算):

@Override
public void onWindowFocusChanged(boolean hasFocus)
{
    super.onWindowFocusChanged(hasFocus);
}
Run Code Online (Sandbox Code Playgroud)

问题:默认情况下选择第二个选项卡,然后单击第一个选项卡,onWindowFocusChanged()永远不会在Activity_1中调用(与第一个选项卡关联).两个活动都扩展了普通的Activity类.

如何解决这个问题的任何线索将不胜感激!

Cat*_*ata 12

如果您需要等到绘制特定视图然后进行计算,您可以使用viewTreeObserver来监听布局更改并在那里进行计算.像这样使用它:

ViewTreeObserver vto = mainLayout.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
public void onGlobalLayout() {
    // remove the listener so it won't get called again if the view layout changes
    mainLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
    // add your calculations here
}}
Run Code Online (Sandbox Code Playgroud)

编辑:

感谢Edison的进一步细节.

对于那些想要支持API <16的人,你可以做到

if (Build.VERSION.SDK_INT >= 16) {     
    mainLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
} else { 
    mainLayout.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
}
Run Code Online (Sandbox Code Playgroud)

  • 对于那些想要采用API <16的人,可以执行if(Build.VERSION.SDK_INT> = 16){mainLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this); } else {mainLayout.getViewTreeObserver().removeGlobalOnLayoutListener(this); } (4认同)