当WebView聚焦时,Android webview onBackPressed不会被触发

时间:2014-03-12 06:00:38

标签: android android-webview

我有一个活动,里面有一个webView(Chromium webView https://github.com/mogoweb/chromium_webview/)。

屏幕有两个部分,顶部是ViewPager,底部是WebView。加载活动并且webView未处于焦点时,后退键按预期工作,并触发onBackPressed和onKeyDown。

然而,当webView获得焦点时(通过点击或聚焦文本字段),活动似乎没有按预期处理密钥,并且onBackPress和onKeyDown都没有被触发。

我尝试过的事情: - 我试过onBackPress和onKeyDown。 - 尝试设置android:descendantFocusability =" blocksDescendants"对于linearlayout,但webView不再获得焦点。

我相信大部分代码都是标准的java,因为当webView不在焦点时会触发事件,我认为在聚焦webView时我会处理不好的事情。

活动是"片段活动"

非常感谢任何建议。 以下是backpress和keydown的代码,甚至调试消息也不会被看到,也没有错误。

XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" 
    android:background="@drawable/order_mode"
    android:descendantFocusability="blocksDescendants">
    <RelativeLayout 
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 

        >           
        <LinearLayout 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/frame_surface_view"
            >
        <io.vov.vitamio.widget.VideoView
            android:id="@+id/surface_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent" 
            android:layout_gravity="top" 
            />
        </LinearLayout>
        <LinearLayout 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBottom="@+id/frame_surface_view"
            android:layout_alignRight="@+id/frame_surface_view"  
            android:layout_margin="20dp"      
            >
        <ImageButton
            android:id="@+id/btnGift"
            android:layout_width="40dp"
            android:layout_height="40dp"
            android:background="@drawable/gift" 
            />
        <ImageButton
            android:id="@+id/btnPraise"
            android:layout_width="40dp"
            android:layout_height="40dp"
            android:background="@drawable/praise" 
            android:layout_marginLeft="15dp"

            />      
        <Spinner
            android:id="@+id/spinnerPriaseMessages"
            android:layout_width="0dp"
            android:layout_height="30dp"
            android:textColor="#000000"
            android:gravity="center_horizontal|center_vertical"
            android:textSize="12sp"
            android:layout_below="@+id/indicator"
            android:layout_toRightOf="@+id/txtCount"
            android:background="@drawable/bg_input"
            android:layout_marginLeft="4dp"
            android:layout_marginRight="4dp"
            android:entries="@array/praise_count_array"
            android:prompt="@string/selectPraise"
            android:spinnerMode="dialog" />                 
        </LinearLayout>
    </RelativeLayout>
    <RelativeLayout
        android:id="@+id/webViewRelative"
        android:layout_width="match_parent"
            android:layout_height="wrap_content">
        <com.mogoweb.chrome.WebView
            android:id="@+id/webView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:focusable="true" />    
    </RelativeLayout> 
    <io.vov.vitamio.widget.CenterLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </io.vov.vitamio.widget.CenterLayout>

</LinearLayout>

事件

@Override
public void onBackPressed(){
    System.out.println("Back Pressed");
    if(webView.isFocused()){
        super.onBackPressed();
        finish();   
    }
    System.out.println("BackPressed");
    if(!giftShown){
        mVideoView.stopPlayback();

        finish();                   
    }else{
        System.out.println("Hiding Fragment Gift");
        getSupportFragmentManager().popBackStack();
        giftShown=false;
    }           

}    
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) 
{
    System.out.println("onKeyDown");
    if ((keyCode == KeyEvent.KEYCODE_BACK) ) {

        if(webView.isFocused()){
            super.onBackPressed();
            finish();
        }
        System.out.println("BackPressed");
        if(!giftShown){
            mVideoView.stopPlayback();
            finish();
        }else{
            System.out.println("Hiding Fragment Gift");
            getSupportFragmentManager().popBackStack();
            giftShown=false;
        }
    }
    return super.onKeyDown(keyCode, event);
}

1 个答案:

答案 0 :(得分:0)

我尝试这种方式来解决这个问题,在onCreateView片段上添加此代码:

webView.setOnKeyListener(new OnKeyListener(){
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) {
                    webView.clearFocus();
                    return true;
                }
                return false;
            }
        });

或者在fragmentActivity上尝试这种方式:

 if (webView.isFocused() && webView.canGoBack()) {
    super.onBackPressed();
 }