启用 youtube 视频从全屏返回后,Android 软键盘将不显示

Posted

技术标签:

【中文标题】启用 youtube 视频从全屏返回后,Android 软键盘将不显示【英文标题】:Android soft-keyboard will not display after enabling youtube video to return from full screen 【发布时间】:2019-12-27 02:25:24 【问题描述】:

我的应用大量使用 youtube 视频来回答有关产品和安装这些产品的问题。就上下文而言,我是一名全栈 Web 开发人员,并且只有一个月的 java/android studio 开发经验。该应用程序仅用 javascript 和 css 编写,我使用 android webview 将其显示为应用程序。目前,我有一个隐藏完整 youtube 视频并显示全屏 youtube 视频的 web chrome 客户端。一旦一个视频全屏显示,然后返回正常视图,如果我点击输入字段,键盘不会显示,我会在调试器中收到消息。

“I/AssistStructure:扁平化最终辅助数据:1928 字节,包含 1 个窗口,5 个视图”

认为它来自隐藏自定义视图的网络 chrome 客户端。

认为答案是检查视图是否是键盘,而不是执行 onHideCustomView();但我不确定情况是否如此,或者我只是在做一些愚蠢的事情。

以下是大多数应用程序的代码或足够的上下文。

感谢你们花时间帮助我。

如果我能改进这个过程,任何指针也将不胜感激。

谢谢你:)

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    getSupportActionBar().hide();
    myWebView = new WebView(this);
    setContentView(myWebView);
    myWebView.setWebChromeClient(new MyChrome());
    myWebView.setWebViewClient(new WebViewClient());
    myWebView.loadUrl("url");

    WebSettings webSettings = myWebView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    myWebView.requestFocus(View.FOCUS_DOWN);




@RequiresApi(api = Build.VERSION_CODES.KITKAT)
public boolean onKeyDown (int keyCode, KeyEvent event) 
    if (keyCode == KeyEvent.KEYCODE_BACK) 
        String webUrl = myWebView.getUrl();
        if (webUrl.indexOf("directory/url") < 0)

                myWebView.loadUrl("url");


            return true;
        else 
            myWebView.loadUrl("javascript:android();");
            return true;
        

    
    return super.onKeyDown(keyCode, event);




private class MyChrome extends WebChromeClient 

    private View mCustomView;
    private WebChromeClient.CustomViewCallback mCustomViewCallback;
    protected FrameLayout mFullscreenContainer;
    private int mOriginalOrientation;
    private int mOriginalSystemUiVisibility;

    MyChrome() 



    public void onHideCustomView()
    
        ((FrameLayout)getWindow().getDecorView()).removeView(this.mCustomView);
        this.mCustomView = null;
        getWindow().getDecorView().setSystemUiVisibility(this.mOriginalSystemUiVisibility);
        setRequestedOrientation(this.mOriginalOrientation);
        this.mCustomViewCallback.onCustomViewHidden();
        this.mCustomViewCallback = null;
    

    public void onShowCustomView(View paramView, WebChromeClient.CustomViewCallback paramCustomViewCallback)
    
        if (this.mCustomView != null)
        
            onHideCustomView();
            return;
        
        this.mCustomView = paramView;
        this.mOriginalSystemUiVisibility = getWindow().getDecorView().getSystemUiVisibility();
        this.mOriginalOrientation = getRequestedOrientation();
        this.mCustomViewCallback = paramCustomViewCallback;
        ((FrameLayout)getWindow().getDecorView()).addView(this.mCustomView, new FrameLayout.LayoutParams(-1, -1));
        getWindow().getDecorView().setSystemUiVisibility(3846);
    

【问题讨论】:

【参考方案1】:

只需要清除 webview 上的焦点

public void onHideCustomView()

        ((FrameLayout)getWindow().getDecorView()).removeView(this.mCustomView);


        this.mCustomView = null;
        getWindow().getDecorView().setSystemUiVisibility(this.mOriginalSystemUiVisibility);
        setRequestedOrientation(this.mOriginalOrientation);
        this.mCustomViewCallback.onCustomViewHidden();
        this.mCustomViewCallback = null;
        myWebView.clearFocus();


    

【讨论】:

【参考方案2】:

只要清除它工作的 webview 的焦点。

 public void onHideCustomView()
    

        ((FrameLayout)MainUI.this.getWindow().getDecorView()).removeView(this.mCustomView);
        this.mCustomView = null;
        MainUI.this.getWindow().getDecorView()
                .setSystemUiVisibility(this.mOriginalSystemUiVisibility);
        MainUI.this.setRequestedOrientation(this.mOriginalOrientation);
        this.mCustomViewCallback.onCustomViewHidden();
        this.mCustomViewCallback = null;

        ((FrameLayout)getWindow().getDecorView()).removeView(this.mCustomView);
        webView.clearFocus();
  

【讨论】:

以上是关于启用 youtube 视频从全屏返回后,Android 软键盘将不显示的主要内容,如果未能解决你的问题,请参考以下文章

MPMoviePlayerController:无法从全屏切换到嵌入式

旧版chrome全屏YouTube视频后右侧滚动条

从全屏模式关闭 MPMoviewPlayer 后 UITableView 下的空(白)行

全屏 Youtube 视频后开始/结束外观转换的不平衡调用

如何以编程方式将窗口从全屏切换到正常模式?

YouTube iframe 嵌入 - 全屏