我有一个片段的容器中,我已经嵌入一回功能的web视图。它工作正常的导航与设备后退按钮web视图中。然而,当我点击设备的后退按钮,退出碎片说我打开包含片段1日消息,然后片段2包含此web视图,然后我点击设备的后退按钮返回到新闻的片段,它不工作,它乌斯追溯到到应用程序的主页。下面是我使用的是code类。我不知道如何去做,做我需要编辑一些回来pressed()函数?如果是的话我怎么去了解它,或者是有办法的话(goingback)我可以创建,返回-1回到1级。任何想法?
谢谢!贾斯汀
@燮pressLint(ValidFragment)
公共类MoneyWebViewFragment扩展片段实现OnClickListener,MainActivity.Back pressListener<片断> {
私有静态最后弦乐SEARCH_TERM =SEARCH_TERM;
私有静态字符串mSearchTerm;
私人的WebView mWebview;
私有静态MoneyWebViewFragment sUserProfileManager;
公共布尔mIsMoneyFragment;
公共最后静态字符串符号=符号;
公共静态INT PIC_WIDTH = 30;
私有静态最后弦乐SYMBOL_TYPE =symbol_type;
公共静态最后弦乐CONTAINER_ID =container_id;
公共静态最后弦乐TAG_Money_FRAGMENT_WEBVIEW =MoneyWebViewFragment;
共享preferencesManager经理=共享preferencesManager.getInstance();
私有静态字符串的URL;
私人最终字符串username = manager.getLoginUsername();
私人最终字符串PASSWORD = manager.getDecryptedLoginPassword();
的LinearLayout进度;
私有静态MoneyWebViewFragment __newInstance(最终MoneyWebViewFragment片段,最终FragmentManager经理,
最终字符串搜索关键词,最后弦乐symbolType,诠释containerViewId,最终诠释inAnimation,最终诠释outAnimation,最终诠释popInAnimation,最终诠释popOutAnimation){
最后的捆绑包=新包();
bundle.putString(SEARCH_TERM,搜索关键词);
bundle.putString(MoneyWebViewFragment.SYMBOL_TYPE,symbolType);
bundle.putInt(MoneyWebViewFragment.CONTAINER_ID,containerViewId);
fragment.setArguments(包);
FragmentInfo fragmentInfo =新FragmentInfo(TransactionMethods.ADD,containerViewId);
fragmentInfo.setAnimation(inAnimation,outAnimation);
fragmentInfo.setPopAnimation(popInAnimation,popOutAnimation);
fragmentInfo.setFragmentTag(TAG_Money_FRAGMENT_WEBVIEW);
fragmentInfo.setActionBarTitle(Application.getAp presources()的getString(R.string.title_search));
。FragmentStackManager.getInstance()transitionFragment(经理,片段,fragmentInfo);
URL =的getURL();
返回片段;
}
@覆盖
公共无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
捆绑包= this.getArguments();
URL =的getURL();
如果(捆绑!= NULL)
mSearchTerm = getArguments()的getString(SEARCH_TERM)。
}
公共无效setSearchTerms(字符串sTerms){
mSearchTerm = sTerms;
}
公共静态无效removeInstance(最终FragmentManager经理){
最后MoneyWebViewFragment片段=(MoneyWebViewFragment)manager.findFragmentByTag(TAG_Money_FRAGMENT_WEBVIEW);
如果(片段== NULL){
返回;
}
最终FragmentStackManager stackManager = FragmentStackManager.getInstance();
如果(stackManager.getTopFragment()的instanceof MoneyWebViewFragment){
stackManager.popTopFragment();
}
}
私人布尔goingBack = FALSE;
私人布尔onBack pressClearStack = TRUE;
公共无效setOnBack pressClearStack(布尔B){
b onBack pressClearStack =;
}
公共布尔webViewSteppedBack(){
如果(mWebview =空&安培;!&安培; mWebview.canGoBack()){
WebBackForwardList mWebBackForwardList = mWebview.copyBackForwardList();
串historyUrl = mWebBackForwardList.getItemAtIndex(mWebBackForwardList.getCurrentIndex() - 1).getUrl();
mWebview.goBack();
返回true;
}
返回false;
}
私人MoneyWebViewFragment(){
mIsMoneyFragment = FALSE;
}
公共静态同步无效clearUserProfileManager(){
sUserProfileManager =新MoneyWebViewFragment();
}
公共静态MoneyWebViewFragment的getInstance(){
如果(sUserProfileManager == NULL){
sUserProfileManager =新MoneyWebViewFragment();
}
返回sUserProfileManager;
}
公共布尔isMoneyWebViewFragment(){
返回mIsMoneyFragment;
}
@覆盖
公共布尔回pressed(最终MainActivity mainActivity){
如果(webViewSteppedBack()){
返回true;
}
如果(onBack pressClearStack){
goingBack = TRUE;
FragmentUtils.onBack pressedKnockFragsOffStack(mainActivity,这一点);
}
返回false;
}
私有静态字符串的getURL(){
字符串URL =;
最后弦乐environmentApi =共享preferencesManager.getInstance()getEnvironmentApi()。
如果(environmentApi.equalsIgnoreCase(NetworkUtils.Apis.ALPHA)){
URL =https://abc.com?q="+mSearchTerm+"userAgent=android;
}
返回URL;
}
私有静态MoneyWebViewFragment __newInstance(最终MoneyWebViewFragment片段,最终FragmentManager经理,
最终字符串搜索关键词,最后弦乐symbolType,诠释containerViewId){
返回__newInstance(片段,经理,搜索关键词,symbolType,containerViewId,R.anim.slide_in_from_right,R.anim.slide_out_to_left,R.anim.slide_in_from_left,R.anim.slide_out_to_right);
}
私有静态无效clearWebView(最终FragmentManager经理){
最后MoneyWebViewFragment片段=(MoneyWebViewFragment)manager.findFragmentByTag(TAG_Money_FRAGMENT_WEBVIEW);
如果(片段= NULL和放大器;!&安培;片段的instanceof MoneyWebViewFragment){
((MoneyWebViewFragment)片段).clearWebView();
}
}
公共静态MoneyWebViewFragment的newInstance(最终FragmentManager经理,最终字符串搜索关键词,字符串symbolType){
clearWebView(经理);
返回__newInstance(新MoneyWebViewFragment(),经理,搜索关键词,symbolType,R.id.fragment_container);
}
公共静态MoneyWebViewFragment的newInstance(最终FragmentManager经理,最终字符串搜索关键词,字符串symbolType,诠释containerViewId){
clearWebView(经理);
返回__newInstance(新MoneyWebViewFragment(),经理,搜索关键词,symbolType,containerViewId);
}
公共静态MoneyWebViewFragment newInstanceNoBack pressed(最终FragmentManager经理,最终字符串搜索关键词,最后弦乐symbolType,诠释containerViewId){
MoneyWebViewFragment片段= __newInstance(新MoneyWebViewFragment(),经理,搜索关键词,symbolType,containerViewId);
fragment.setOnBack pressClearStack(假);
返回片段;
}
公共静态MoneyWebViewFragment newInstanceNoBack pressed(最终MoneyWebViewFragment片段,最终FragmentManager经理,最终字符串搜索关键词,最后弦乐symbolType,诠释containerViewId){
fragment.setOnBack pressClearStack(假);
返回__newInstance(片段,经理,搜索关键词,symbolType,containerViewId);
}
公共静态MoneyWebViewFragment newInstanceForSearch(最终FragmentManager经理,最终字符串搜索关键词,字符串symbolType){
MoneyWebViewFragment片段= __newInstance(新MoneyWebViewFragment(),经理,搜索关键词,symbolType,R.id.fragment_container,R.anim.no_animation,R.anim.slide_out_to_right,R.anim.slide_in_from_right,R.anim.slide_out_to_right);
返回片段;
}
@覆盖
公共无效onResume(){
super.onResume();
最后MainActivity活性=(MainActivity)getActivity();
activity.updateActionBarTitle();
activity.setBack pressListener(本);
}
公共无效clearWebView(){
如果(mWebview!= NULL){
mWebview.removeAllViews();
mWebview.destroy();
mWebview = NULL;
}
}
@覆盖
公共无效的onClick(视图v){
}
@燮pressWarnings(德precation)
@燮pressLint({
SetJavaScriptEnabled,NewApi
})
@覆盖
公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,捆绑savedInstanceState){
如果(goingBack){
返回null;
}
最后MainActivity活性=(MainActivity)getActivity();
activity.setBack pressListener(本);
查看查看= inflater.inflate(R.layout.fragment_search_Money,集装箱,假);
mWebview =(web视图)view.findViewById(R.id.webview);
进度=(的LinearLayout)view.findViewById(R.id.loading);
mWebview.setVisibility(View.VISIBLE);
progressBar.setVisibility(View.VISIBLE);
mWebview.setWebViewClient(新MyWebViewClient(这一点,mWebview));
。mWebview.getSettings()setUseWideViewPort(真正的);
//mWebview.getSettings().setDefaultZoom(ZoomDensity.CLOSE);
//mWebview.getSettings().setBuiltInZoomControls(false);
//mWebview.getSettings().setSupportZoom(false);
mWebview.setBackgroundColor(0);
。mWebview.getSettings()setJavaScriptCanOpenWindowsAutomatically(真正的);
。mWebview.getSettings()setAllowFileAccess(真正的);
mWebview.getSettings()setDomStorageEnabled(真)。
mWebview.getSettings()setJavaScriptEnabled(真)。
mWebview.setScrollbarFadingEnabled(假);
。mWebview.getSettings()getLoadsImagesAutomatically();
mWebview.setWebChromeClient(新WebChromeClient(){
@覆盖
公共无效onReceivedTitle(web视图查看,串题){
super.onReceivedTitle(查看,职称);
字符串SERVERERROR =412;
如果(title.contains(SERVERERROR)){
view.stopLoading();
SearchResultsFragment.newInstance(getFragmentManager(),mSearchTerm);
}
}
});
如果(Build.VERSION.SDK_INT> = Build.VERSION_ codeS.HONEYCOMB)
。mWebview.getSettings()setDisplayZoomControls(假);
共享preferencesManager经理=共享preferencesManager.getInstance();
CookieStore的CookieStore的= mgr.getCookieStore();
。饼干饼干= cookieStore.getCookies()得到(0);
串cookieString = cookie.getName()+=+ cookie.getValue()+;域=+ cookie.getDomain();
CookieManager cookieMgr = CookieManager.getInstance();
cookieMgr.setCookie(URL,cookieString);
mWebview.loadUrl(URL);
返回查看;
}
公共类MyWebViewClient扩展WebViewClient {
//私人字符串loginCookie;
私人诠释rIdParent_id = -1;
公共无效setRIdParent_id(INT ID){
rIdParent_id = ID;
}
公共MyWebViewClient(MoneyWebViewFragment MoneyWebViewFragment,的WebView的WebView){
超();
}
@覆盖
公共无效onPageStarted(web视图查看,字符串URL,位图图标){
view.setVisibility(View.VISIBLE);
}
@覆盖
公共无效onPageFinished(web视图查看,字符串URL){
view.setVisibility(View.VISIBLE);
最终的动画渐变=新AlphaAnimation(0.0,1.0F);
fade.setDuration(200);
view.startAnimation(淡出);
progressBar.setVisibility(View.GONE);
}
@覆盖
公共无效onReceivedError(web视图来看,INT错误code,字符串描述,字符串failingUrl){
Toast.makeText(view.getContext(),验证错误,Toast.LENGTH_LONG).show();
// CookieManager cookieManager = CookieManager.getInstance();
//cookieManager.setCookie(USERNAME,密码);
super.onReceivedError(查看,错误code,说明,failingUrl);
}
@覆盖
公共无效onLoadResource(web视图查看,字符串URL){
}
@覆盖
公共布尔shouldOverrideUrlLoading(web视图查看,字符串URL){
返回super.shouldOverrideUrlLoading(查看,网址);
}
@覆盖
公共无效onReceivedHttpAuthRequest(web视图查看,最终HttpAuthHandler处理程序,最后弦乐主机,最后弦乐境界){
// CookieManager cookieManager = CookieManager.getInstance();
//cookieManager.setCookie(USERNAME,密码);
handler.proceed(用户名,密码);
}
@覆盖
公共无效onReceivedSslError(web视图来看,SslErrorHandler处理器,SslError错误){
handler.proceed();
}
}
/ * @覆盖
公共无效onDetach(){
super.onDetach();
// mView.removeView(mWebview);
// mWebview.removeAllViews();
QuotesFragmentWebView.newInstanceNoBack pressed(getFragmentManager(),mSearchTerm,goog MSFT,-1);
// mWebview.destroy();
} * /
}
解决方案
评论/敲了这一点: FragmentUtils.onBack pressedKnockFragsOffStack(mainActivity,这一点)
;
I have a webview in a fragment container in which I have embedded a back functionality. It works fine for navigation within the webview with the device back button. However, when I click on the device back button to exit the fragment say I open fragment 1 containing news and then fragment 2 containing this webview and then i click device back button to go back to news fragment, it doesnt work, it ust goes back to the main page of the app. Here's the code class I am using. I am not sure how to go about it , do I have to edit to some backpressed() function ? if so how do I go about it or is there a way I can create if(goingback), return -1 for going back 1 step. Any ideas?
Thanks! Justin
@SuppressLint("ValidFragment")
public class MoneyWebViewFragment extends Fragment implements OnClickListener , MainActivity.BackPressListener<Fragment> {
private static final String SEARCH_TERM = "search_term";
private static String mSearchTerm;
private WebView mWebview;
private static MoneyWebViewFragment sUserProfileManager;
public boolean mIsMoneyFragment;
public final static String SYMBOL = "symbol";
public static int PIC_WIDTH = 30;
private static final String SYMBOL_TYPE = "symbol_type";
public static final String CONTAINER_ID = "container_id";
public static final String TAG_Money_FRAGMENT_WEBVIEW = "MoneyWebViewFragment";
SharedPreferencesManager manager = SharedPreferencesManager.getInstance();
private static String URL;
private final String USERNAME = manager.getLoginUsername();
private final String PASSWORD = manager.getDecryptedLoginPassword();
LinearLayout progressBar;
private static MoneyWebViewFragment __newInstance(final MoneyWebViewFragment fragment, final FragmentManager manager,
final String searchTerm, final String symbolType, int containerViewId, final int inAnimation, final int outAnimation, final int popInAnimation, final int popOutAnimation) {
final Bundle bundle = new Bundle();
bundle.putString(SEARCH_TERM, searchTerm);
bundle.putString(MoneyWebViewFragment.SYMBOL_TYPE, symbolType);
bundle.putInt(MoneyWebViewFragment.CONTAINER_ID, containerViewId);
fragment.setArguments(bundle);
FragmentInfo fragmentInfo = new FragmentInfo(TransactionMethods.ADD, containerViewId);
fragmentInfo.setAnimation(inAnimation, outAnimation);
fragmentInfo.setPopAnimation(popInAnimation, popOutAnimation);
fragmentInfo.setFragmentTag(TAG_Money_FRAGMENT_WEBVIEW);
fragmentInfo.setActionBarTitle(Application.getAppResources().getString(R.string.title_search));
FragmentStackManager.getInstance().transitionFragment(manager, fragment, fragmentInfo);
URL = getUrl();
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle bundle = this.getArguments();
URL = getUrl();
if(bundle != null)
mSearchTerm = getArguments().getString(SEARCH_TERM);
}
public void setSearchTerms(String sTerms){
mSearchTerm = sTerms;
}
public static void removeInstance(final FragmentManager manager) {
final MoneyWebViewFragment fragment = (MoneyWebViewFragment) manager.findFragmentByTag(TAG_Money_FRAGMENT_WEBVIEW);
if (fragment == null) {
return;
}
final FragmentStackManager stackManager = FragmentStackManager.getInstance();
if (stackManager.getTopFragment() instanceof MoneyWebViewFragment) {
stackManager.popTopFragment();
}
}
private boolean goingBack = false;
private boolean onBackPressClearStack = true;
public void setOnBackPressClearStack(boolean b){
onBackPressClearStack = b;
}
public boolean webViewSteppedBack() {
if (mWebview != null && mWebview.canGoBack()) {
WebBackForwardList mWebBackForwardList = mWebview.copyBackForwardList();
String historyUrl = mWebBackForwardList.getItemAtIndex(mWebBackForwardList.getCurrentIndex()-1).getUrl();
mWebview.goBack();
return true;
}
return false;
}
private MoneyWebViewFragment() {
mIsMoneyFragment = false;
}
public static synchronized void clearUserProfileManager() {
sUserProfileManager = new MoneyWebViewFragment();
}
public static MoneyWebViewFragment getInstance() {
if (sUserProfileManager == null) {
sUserProfileManager = new MoneyWebViewFragment();
}
return sUserProfileManager;
}
public boolean isMoneyWebViewFragment() {
return mIsMoneyFragment;
}
@Override
public boolean backPressed(final MainActivity mainActivity) {
if (webViewSteppedBack()) {
return true;
}
if (onBackPressClearStack) {
goingBack = true;
FragmentUtils.onBackPressedKnockFragsOffStack(mainActivity, this);
}
return false;
}
private static String getUrl(){
String url = "";
final String environmentApi = SharedPreferencesManager.getInstance().getEnvironmentApi();
if (environmentApi.equalsIgnoreCase(NetworkUtils.Apis.ALPHA)) {
url = "https://abc.com?q="+mSearchTerm+"userAgent=android";
}
return url;
}
private static MoneyWebViewFragment __newInstance(final MoneyWebViewFragment fragment, final FragmentManager manager,
final String searchTerm, final String symbolType, int containerViewId) {
return __newInstance(fragment, manager,searchTerm, symbolType, containerViewId, R.anim.slide_in_from_right, R.anim.slide_out_to_left, R.anim.slide_in_from_left, R.anim.slide_out_to_right);
}
private static void clearWebView(final FragmentManager manager) {
final MoneyWebViewFragment fragment = (MoneyWebViewFragment) manager.findFragmentByTag(TAG_Money_FRAGMENT_WEBVIEW);
if (fragment != null && fragment instanceof MoneyWebViewFragment) {
((MoneyWebViewFragment)fragment).clearWebView();
}
}
public static MoneyWebViewFragment newInstance(final FragmentManager manager, final String searchTerm, String symbolType) {
clearWebView(manager);
return __newInstance(new MoneyWebViewFragment(), manager, searchTerm, symbolType, R.id.fragment_container);
}
public static MoneyWebViewFragment newInstance(final FragmentManager manager, final String searchTerm, String symbolType, int containerViewId) {
clearWebView(manager);
return __newInstance(new MoneyWebViewFragment(), manager, searchTerm, symbolType, containerViewId);
}
public static MoneyWebViewFragment newInstanceNoBackPressed(final FragmentManager manager, final String searchTerm, final String symbolType, int containerViewId) {
MoneyWebViewFragment fragment = __newInstance(new MoneyWebViewFragment(), manager, searchTerm, symbolType, containerViewId);
fragment.setOnBackPressClearStack(false);
return fragment;
}
public static MoneyWebViewFragment newInstanceNoBackPressed(final MoneyWebViewFragment fragment, final FragmentManager manager, final String searchTerm, final String symbolType, int containerViewId) {
fragment.setOnBackPressClearStack(false);
return __newInstance(fragment, manager, searchTerm, symbolType, containerViewId);
}
public static MoneyWebViewFragment newInstanceForSearch(final FragmentManager manager, final String searchTerm, String symbolType) {
MoneyWebViewFragment fragment = __newInstance(new MoneyWebViewFragment(), manager, searchTerm, symbolType, R.id.fragment_container, R.anim.no_animation, R.anim.slide_out_to_right, R.anim.slide_in_from_right, R.anim.slide_out_to_right);
return fragment;
}
@Override
public void onResume() {
super.onResume();
final MainActivity activity = (MainActivity) getActivity();
activity.updateActionBarTitle();
activity.setBackPressListener(this);
}
public void clearWebView() {
if (mWebview != null) {
mWebview.removeAllViews();
mWebview.destroy();
mWebview = null;
}
}
@Override
public void onClick(View v) {
}
@SuppressWarnings("deprecation")
@SuppressLint({
"SetJavaScriptEnabled", "NewApi"
})
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (goingBack) {
return null;
}
final MainActivity activity = (MainActivity) getActivity();
activity.setBackPressListener(this);
View view = inflater.inflate(R.layout.fragment_search_Money, container, false);
mWebview = (WebView)view.findViewById(R.id.webview);
progressBar = (LinearLayout) view.findViewById(R.id.loading);
mWebview.setVisibility(View.VISIBLE);
progressBar.setVisibility(View.VISIBLE);
mWebview.setWebViewClient(new MyWebViewClient(this, mWebview));
mWebview.getSettings().setUseWideViewPort(true);
//mWebview.getSettings().setDefaultZoom(ZoomDensity.CLOSE);
//mWebview.getSettings().setBuiltInZoomControls(false);
//mWebview.getSettings().setSupportZoom(false);
mWebview.setBackgroundColor(0);
mWebview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
mWebview.getSettings().setAllowFileAccess(true);
mWebview.getSettings().setDomStorageEnabled(true);
mWebview.getSettings().setJavaScriptEnabled(true);
mWebview.setScrollbarFadingEnabled(false);
mWebview.getSettings().getLoadsImagesAutomatically();
mWebview.setWebChromeClient(new WebChromeClient() {
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
String serverError = "412";
if (title.contains(serverError)) {
view.stopLoading();
SearchResultsFragment.newInstance(getFragmentManager(), mSearchTerm);
}
}
});
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
mWebview.getSettings().setDisplayZoomControls(false);
SharedPreferencesManager mgr = SharedPreferencesManager.getInstance();
CookieStore cookieStore = mgr.getCookieStore();
Cookie cookie = cookieStore.getCookies().get(0);
String cookieString = cookie.getName() + "=" + cookie.getValue() + "; domain=" + cookie.getDomain();
CookieManager cookieMgr = CookieManager.getInstance();
cookieMgr.setCookie(URL, cookieString);
mWebview.loadUrl(URL);
return view;
}
public class MyWebViewClient extends WebViewClient {
//private String loginCookie;
private int rIdParent_id = -1;
public void setRIdParent_id (int id) {
rIdParent_id= id;
}
public MyWebViewClient(MoneyWebViewFragment MoneyWebViewFragment, WebView webview) {
super();
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
view.setVisibility(View.VISIBLE);
}
@Override
public void onPageFinished(WebView view, String url) {
view.setVisibility(View.VISIBLE);
final Animation fade = new AlphaAnimation(0.0f, 1.0f);
fade.setDuration(200);
view.startAnimation(fade);
progressBar.setVisibility(View.GONE);
}
@Override
public void onReceivedError( WebView view, int errorCode, String description, String failingUrl ) {
Toast.makeText(view.getContext(), "Authentication Error", Toast.LENGTH_LONG).show();
// CookieManager cookieManager = CookieManager.getInstance();
//cookieManager.setCookie(USERNAME, PASSWORD);
super.onReceivedError(view, errorCode, description, failingUrl);
}
@Override
public void onLoadResource( WebView view, String url ){
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return super.shouldOverrideUrlLoading(view, url);
}
@Override
public void onReceivedHttpAuthRequest( WebView view, final HttpAuthHandler handler, final String host, final String realm ){
// CookieManager cookieManager = CookieManager.getInstance();
//cookieManager.setCookie(USERNAME, PASSWORD);
handler.proceed(USERNAME,PASSWORD);
}
@Override
public void onReceivedSslError( WebView view, SslErrorHandler handler, SslError error ) {
handler.proceed();
}
}
/* @Override
public void onDetach() {
super.onDetach();
// mView.removeView(mWebview);
// mWebview.removeAllViews();
QuotesFragmentWebView.newInstanceNoBackPressed(getFragmentManager(), mSearchTerm, "goog msft", -1);
// mWebview.destroy();
}*/
}
解决方案
Comment/Knock this out : FragmentUtils.onBackPressedKnockFragsOffStack(mainActivity, this)
;