2012-05-17 21 views
19

CẬP NHẬT: Đã giải quyết! Vấn đề liên quan đến Viewpager của tôi không phải là WebView.Cách thêm chức năng "Quay lại" trong WebView bên trong Phân đoạn?

Tôi đang cố gắng thêm chức năng "Quay lại" vào số WebView nằm trong số Fragment. Nhưng tôi không thể tìm ra cách để:

public final class TestFragment extends Fragment { 

    static WebView mWeb; 
    private View mContentView; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) 
    { 
     mContentView = inflater.inflate(R.layout.webview, null); 
     mWeb = (WebView)mContentView.findViewById(R.id.webview); 

     WebSettings settings = mWeb.getSettings(); 
     settings.setJavaScriptEnabled(true); 
     settings.setSupportZoom(false); 
     mWeb.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); 
     mWeb.getSettings().setBuiltInZoomControls(false); 
     mWeb.loadUrl("myurl..."); 
     mWeb.setOnKeyListener(new OnKeyListener(){ 
      public boolean onKey(View v, int keyCode, KeyEvent event) { 
       if ((keyCode == KeyEvent.KEYCODE_BACK) && mWeb.canGoBack()) { 
        mWeb.goBack(); 
        return true; 
       } 
       return false; 
      } 
     }); 
    } 
} 

Tôi cũng đã cố gắng một cái gì đó như:

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if ((keyCode == KeyEvent.KEYCODE_BACK) && mWeb.canGoBack()) { 
     mWeb.goBack(); 
     return true; 
    } 
    return super.onKeyDown(keyCode, event); 
} 

Một giải pháp nhưng cùng một vấn đề:

@Override 
public void onBackPressed() 
{ 
    if(webView.canGoBack()) 
     webView.goBack(); 
    else 
     super.onBackPressed(); 
} 

Bất kỳ ý tưởng làm thế nào để làm việc này ?

+0

gì sẽ xảy ra? tùy chọn thứ ba thực hiện onBackPressed() làm việc cho tôi, hãy chắc chắn rằng bạn thực sự có một cái gì đó để quay trở lại. –

+0

và sự cố là gì? Tôi có một tình huống rất giống nhau :) – desgraci

+0

[Làm cách nào để quay lại trang trước nếu nút quay lại được nhấn trong WebView?] (Https://stackoverflow.com/q/6077141/6521116) –

Trả lời

20

Thực ra bạn không thể thực hiện trực tiếp bên trong đoạn. onBackPressed có thể bị ghi đè trong số FragmentActivity. Những gì bạn có thể làm là:

  1. Ghi đè onBackPressed bên trong hoạt động.
  2. Khi gọi onBackPressed, hãy kiểm tra xem thể hiện của đoạn hiện tại có phải là trường hợp hiển thị webview hay không.
  3. Nếu có, hãy yêu cầu fragment nếu webview có thể quay lại.
  4. nếu nó không phải là, hãy gọi super hoặc bất cứ điều gì bạn cần

Edit:

@Override 
public void onBackPressed() { 
     Fragment webview = getSupportFragmentManager().findFragmentByTag("webview"); 
     if (webview instanceof MyWebViewFragment) { 
       boolean goback = ((MyWebViewFragment)webview).canGoBack(); 
       if (!goback) 
       super.onBackPressed(); 
     } 
} 
+2

Cảm ơn bạn đã viết mã này, thực sự đã giúp tôi cung cấp giải pháp nhanh cho các sự cố tôi gặp phải với ngăn điều hướng và chế độ xem web phân đoạn. –

36

Có lẽ hạn chế android của nó. Hãy thử làm điều này bằng cách sử dụng trình xử lý.

public final class TestFragment extends Fragment { 


    static WebView mWeb; 
    private View mContentView; 

    private Handler handler = new Handler(){ 
     @Override 
     public void handleMessage(Message message) { 
      switch (message.what) { 
       case 1:{ 
        webViewGoBack(); 
       }break; 
      } 
     } 
    }; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { 

     mContentView = inflater.inflate(R.layout.webview, null); 
     mWeb = (WebView)mContentView.findViewById(R.id.webview); 

     WebSettings settings = mWeb.getSettings(); 
     settings.setJavaScriptEnabled(true); 
     settings.setSupportZoom(false); 
     mWeb.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); 
     mWeb.getSettings().setBuiltInZoomControls(false); 
     mWeb.loadUrl("myurl..."); 
     mWeb.setOnKeyListener(new OnKeyListener(){ 

      public boolean onKey(View v, int keyCode, KeyEvent event) { 
       if (keyCode == KeyEvent.KEYCODE_BACK 
         && event.getAction() == MotionEvent.ACTION_UP 
         && mWeb.canGoBack()) { 
        handler.sendEmptyMessage(1); 
        return true; 
       } 

       return false; 
      } 

     }); 

    } 

    private void webViewGoBack(){ 
     mWeb.goBack(); 
    } 
} 
+0

mWeb.setOnKeyListener đã làm các trick cho tôi, Nhiều Cảm ơn –

+1

Làm việc cho tôi quá, Điều này nên được chọn là câu trả lời! –

+1

hoạt động, tuy nhiên có một lỗ hổng. Bạn chỉ phát hiện mã khóa, không phải KeyEvent. Vì vậy, khi bạn nhấn nút quay lại, bạn đang onKey sẽ nhận được gọi hai lần, trên cho downpress và một cho lên. Vì vậy, nó phải là: nếu (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == MotionEvent.ACTION_UP) { –

2

bạn có thể làm điều này bằng cách:

  • trong Activity đặt:

    // Set WebView 
    
    public void setWebView(WebView web) { 
    
        this.web = web; 
    } 
    
  • trong mảnh web sau khi ActivityCreated() đặt:

    ((Your_Activity) getActivity()).setWebView(webView);

  • Đừng quên để thiết lập webView từ onCreateView() như thế này:

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
        webView = (WebView) inflater.inflate(R.layout.your_web_fragment, container, 
          false); 
        return web; 
    } 
    
3

giải pháp của tôi là ở đoạn tôi bổ sung vào phương pháp nào

public static boolean canGoBack(){ 
     return mWebView.canGoBack(); 
    } 

    public static void goBack(){ 
     mWebView.goBack(); 
    } 

sau đó từ hoạt động tôi gọi

@Override 
public void onBackPressed() { 
    if(webFragment.canGoBack()){ 
     webFragment.goBack(); 
    }else{ 
     super.onBackPressed(); 
    } 

} 

lưu ý mwebview là s tatic

5

Trong WebViewActivity.java, tôi đã thêm 1 phương pháp:

@Override 
public void onBackPressed() { 

    WebViewFragment fragment = (WebViewFragment) 
      getSupportFragmentManager().findFragmentById(R.id.fragmentContainer); 
    if (fragment.canGoBack()) { 
     fragment.goBack(); 
    } else { 
     super.onBackPressed(); 
    } 
} 

Trong WebViewFragment.java, tôi đã thêm 2 phương pháp:

public boolean canGoBack() { 
    return mWebView.canGoBack(); 
} 

public void goBack() { 
    mWebView.goBack(); 
} 
1

@OmidAmnivia câu trả lời là đúng ứng dụng của bạn là giải pháp cho vụ tai nạn là

@Override 
public void onBackPressed() { 
if(webFragment.isInitialized && webFragment.canGoBack()){ 
    webFragment.goBack(); 
}else{ 
    super.onBackPressed(); 
} 
} 

Bạn phải kiểm tra xem lớp học của bạn có phải là initiali hay không hay không.

0

Trước hết lấy lại ép trong đoạn

mContentView.setFocusableInTouchMode(true); 
mContentView.requestFocus(); 
mContentView.setOnKeyListener(new OnKeyListener() 
{ 
    @Override 
    public boolean onKey(View v, int keyCode, KeyEvent event) 
    { 
     if(keyCode == KeyEvent.KEYCODE_BACK) 
     { 
     if (mWebView.canGoBack()) { 
       mWebView.goBack(); 
       retune false; 
      } else { 
       return true; 
      } 

     } 
     return false; 
    } 
}); 

hy vọng nó sẽ làm việc.

1

@ RomanBlack câu trả lời cho tôi ý tưởng đúng, nhưng vì chúng tôi sử dụng kotlin, tôi phải điều chỉnh câu trả lời một chút.

webView.setOnKeyListener { _, _, keyEvent -> 
     if (keyEvent.keyCode == KeyEvent.KEYCODE_BACK && !webView.canGoBack()) { 
      false 
     } else if (keyEvent.keyCode == KeyEvent.KEYCODE_BACK && keyEvent.action == MotionEvent.ACTION_UP) { 
      webView.goBack() 
      true 
     } else true 
    } 

nếu bạn muốn làm điều đó với lợi nhuận bạn phải thêm một cái gì đó như:

[email protected] true 
2

Bạn có thể kiểm tra mã này:

webView.canGoBack(); 
    webView.setOnKeyListener(new View.OnKeyListener() { 

     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      if (keyCode == KeyEvent.KEYCODE_BACK 
        && event.getAction() == MotionEvent.ACTION_UP 
        && webView.canGoBack()) { 
       webView.goBack(); 
       return true; 
      } 
      return false; 
     } 
    }); 
Các vấn đề liên quan