36

更新:解決しました!問題は、WebViewではなくViewpagerに関連していました。

WebView内にある自分に「戻る」機能を追加しようとしていFragmentます。しかし、私は方法を理解することはできません:

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;
            }
        });
    }   
}

私も次のようなことを試しました:

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

別の解決策ですが同じ問題:

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

これを機能させる方法はありますか?

4

14 に答える 14

54

おそらくそのアンドロイドの制限。ハンドラーを使用してこれを実行してみてください。

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();
    }
}
于 2012-05-17T07:46:18.417 に答える
33

このコードを確認できます:

    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;
        }
    });
于 2017-12-08T08:14:12.427 に答える
23

実際には、フラグメント内で直接行うことはできません。はonBackPressedでオーバーライドできますFragmentActivity。あなたができることは次のとおりです。

  1. onBackPressedアクティビティ内をオーバーライドします。
  2. が呼び出されたとき onBackPressedに、現在のフラグメントのインスタンスが を表示しているインスタンスであるかどうかを確認しますwebview
  3. fragmentそうである場合は、元に戻せるかどうかを尋ねwebviewます。
  4. superそうでない場合は、または必要なものを呼び出します

編集:

 @Override
 public void onBackPressed() {
       Fragment webview = getSupportFragmentManager().findFragmentByTag("webview");
       if (webview instanceof MyWebViewFragment) {
              boolean goback = ((MyWebViewFragment)webview).canGoBack();
              if (!goback)
                super.onBackPressed();
       }
 }
于 2012-05-17T07:30:35.773 に答える
8

シンプルなインターフェースを作成しました:

public interface IOnBackPressed {
    boolean onBackPressed();
}

アクティビティで:

public class MyActivity extends Activity {
    @Override public void onBackPressed() {
    Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.main_container);
       if (!(fragment instanceof IOnBackPressed) || !((IOnBackPressed) fragment).onBackPressed()) {
          super.onBackPressed();
       }
    }
}

フラグメントで:

public class MyFragment extends Fragment implements IOnBackPressed {
   @Override
    public boolean onBackPressed() {
        if (webview.canGoBack()) {
            webview.goBack();
            // backpress is not considered in the Activity
            return true;
        } else {
            // activity will act normal
            return false;
        }
    }
}
于 2018-06-26T13:46:52.320 に答える
7

ではWebViewActivity.java、1 つのメソッドを追加しました。

@Override
public void onBackPressed() {

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

ではWebViewFragment.java、2 つのメソッドを追加しました。

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

public void goBack() {
    mWebView.goBack();
}
于 2014-10-19T10:07:49.917 に答える
6

@RomanBlackの答えは正しい考えを与えてくれましたが、kotlinを使用しているため、答えを少し調整する必要がありました。

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
    }

返品でやりたい場合は、次のようなものを追加する必要があります。

return@setOnKeyListener true
于 2017-05-30T06:14:15.747 に答える
2

あなたはこれを行うことができます:

  • 入れてActivity

    // Set WebView
    
    public void setWebView(WebView web) {
    
        this.web = web;
    }
    
  • ActivityCreated()put後の Web フラグメント:

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

  • webView次のonCreateView()ように設定することを忘れないでください。

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        webView = (WebView) inflater.inflate(R.layout.your_web_fragment, container,
                false);
        return web;
    }
    
于 2012-09-17T12:45:47.590 に答える
1

@OmidAmniviaの答えは正しいアプリです。クラッシュの解決策は

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

クラスが初期化されているかどうかを確認する必要があります。

于 2015-10-03T21:53:17.837 に答える
0

最も簡単な答えはsetOnKeyListeneron、webView 自体に突き出すことです。

webView.setOnKeyListener(new View.OnKeyListener() {
    @Override
    public boolean onKey( View v, int keyCode, KeyEvent event ) {
        if (event.getAction() == KeyEvent.ACTION_DOWN) {
            if( keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()){
                webView.goBack();
                return true;
            }
        }
        return false;
    }
});
于 2022-02-27T15:46:04.687 に答える
0

まず断片的に押し戻される

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

それがうまくいくことを願っています。

于 2017-05-05T09:54:54.497 に答える