【问题标题】:Attach/detach Android view to/from layout将 Android 视图附加到布局/从布局分离
【发布时间】:2012-05-08 19:41:04
【问题描述】:

我想在 Application 类派生的 onCreate() 方法中创建一个 WebView,然后在调用活动 onCreate() 时将其附加到主布局,并在调用 onDestroyed() 时将其分离。因此,每次创建/销毁活动时,WebView 组件都是相同的(有点单例)。问题是我(以我的 Windows API 背景)不知道如何做到这一点。只是 new WebView()/addiew()/removeView()?

你问我为什么要这样做? Prevent Android activity from being recreated on turning screen off 总而言之,WebView 永远不应该被破坏。

【问题讨论】:

    标签: android android-layout android-webview


    【解决方案1】:

    没什么特别的。将 MyApp 注册为清单中的应用程序类名称。

    public class MyApp extends Application
    {
        public WebView _WebView = null;
    
        @Override
        public void onCreate()
        {
            _WebView = new WebView(getApplicationContext());
            // Settings etc.
            _WebView.loadUrl("url");
    
            super.onCreate();
        }
    }
    

    从 main.xml 中删除视图。

    public class MyActivity extends Activity
    {
        WebView _WebView;
        RelativeLayout _Layout; // Should be declared in main.xml.
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    
            _Layout = (RelativeLayout) findViewById(R.id.rl);
            ViewTreeObserver vto = _Layout.getViewTreeObserver(); 
            vto.addOnGlobalLayoutListener(new MyLayoutListener()); // .layout(0,0,width,height);
    
            Display display = getWindowManager().getDefaultDisplay();
            MyApp app = (MyApp) this.getApplication();
            _WebView = app._WebView;
            _Layout.addView(_WebView, display.getWidth(), display.getHeight());
        }
    
        @Override
        protected void onDestroy()
        {
            _Layout.removeView(_WebView);
            super.onDestroy();
        }
    }
    
    private class MyLayoutListener implements OnGlobalLayoutListener
    {
        public void onGlobalLayout()
        {
            Display display = getWindowManager().getDefaultDisplay();
            _WebView.layout(0, 0, display.getWidth(), display.getHeight());
            //_Layout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
        }
    }
    

    【讨论】:

    • 这条线怎么样? “vto.addOnGlobalLayoutListener(new MyLayoutListener());”如何编码? MyLayoutListener 不存在。
    • @ElSajko 我现在脱离了上下文,因为 3 年过去了。 MyLayoutListener 代码已添加到自动应答中,但我无法解释为什么以及如何这样做。无论如何,代码是针对 2.3 的,也许这些天应该以另一种方式来做。
    • 我已经完成了,在没有 ViewTreeObserver 的情况下工作。但仍然有帮助的帖子。编辑:Mea Culpa。没有注意到代码有滚动并且有MyLayoutListener。无虚拟机
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多