无法在Webview中返回

时间:2014-08-22 16:37:16

标签: android android-fragments webview

你好,我的项目有一个小问题。我有一个带webview的滑动菜单。但我无法返回网页浏览器,当我按下按钮返回我的应用程序时崩溃。我尝试使用OnBackPressed方法和OnKeyDown,但没有一个工作。这是我的代码。只是主要活动类和webviewfragment类

我应该把方法运用得很好?在webview片段类中,因为webviews扩展片段而没有工作,所以没有工作。

package com.pavan.slidingmenu;

import java.util.ArrayList;
import java.util.List;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.res.Configuration;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.widget.DrawerLayout;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.webkit.WebView;
import android.widget.AdapterView;
import android.widget.ListView;

public class MainActivity extends Activity {

    WebView webview ;


    String[] menutitles;
    TypedArray menuIcons; 
    String[] pageUrl;

    // nav drawer title
    private CharSequence mDrawerTitle;
    private CharSequence mTitle;

    private DrawerLayout mDrawerLayout;
    private ListView mDrawerList;
    private ActionBarDrawerToggle mDrawerToggle;

    private List<RowItem> rowItems;
    private CustomAdapter adapter;



    @SuppressLint("NewApi")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTitle = mDrawerTitle = getTitle();

        menutitles = getResources().getStringArray(R.array.titles);
        menuIcons = getResources().obtainTypedArray(R.array.icons);
        pageUrl = getResources().getStringArray(R.array.pageurl);

        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerList = (ListView) findViewById(R.id.slider_list);

        rowItems = new ArrayList<RowItem>();

        for (int i = 0; i < menutitles.length; i++) {
            RowItem items = new RowItem(menutitles[i], menuIcons.getResourceId(
                    i, -1), pageUrl[i]);
            rowItems.add(items);
        }

        menuIcons.recycle();

        adapter = new CustomAdapter(getApplicationContext(), rowItems);

        mDrawerList.setAdapter(adapter);

        mDrawerList.setOnItemClickListener(new SlideitemListener());

        // enabling action bar app icon and behaving it as toggle button
        getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setHomeButtonEnabled(true);

        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
                R.drawable.ic_drawer, R.string.app_name,
                R.string.app_name) {
            public void onDrawerClosed(View view) {
                getActionBar().setTitle(mTitle);
                // calling onPrepareOptionsMenu() to show action bar icons
                invalidateOptionsMenu();
            }

            public void onDrawerOpened(View drawerView) {
                getActionBar().setTitle(mDrawerTitle);
                // calling onPrepareOptionsMenu() to hide action bar icons
                invalidateOptionsMenu();
            }
        };
        mDrawerLayout.setDrawerListener(mDrawerToggle);

        if (savedInstanceState == null) {
            // on first time display view for first nav item
            updateDisplay(0);

        }
    }

    class SlideitemListener implements ListView.OnItemClickListener {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {
            updateDisplay(position);
        }

    }

    private void updateDisplay(int position) {

        String url = rowItems.get(position).getPageUrl();

        Fragment fragment = new MyWebViewFragment();

        Bundle bundle = new Bundle();
        bundle.putString("url", url);

        fragment.setArguments(bundle);

        FragmentManager fragmentManager = getFragmentManager();
        fragmentManager.beginTransaction()
                .replace(R.id.frame_container, fragment).commit();

        setTitle(menutitles[position]);
        mDrawerLayout.closeDrawer(mDrawerList);

    }

    @Override
    public void setTitle(CharSequence title) {
        mTitle = title;
        getActionBar().setTitle(mTitle);
    }




    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }


    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // toggle nav drawer on selecting action bar app icon/title
        if (mDrawerToggle.onOptionsItemSelected(item)) {
            return true;
        }
        // Handle action bar actions click
        switch (item.getItemId()) {
        case R.id.action_settings:
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }

    /***
     * Called when invalidateOptionsMenu() is triggered
     */
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        // if nav drawer is opened, hide the action items
        boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
        menu.findItem(R.id.action_settings).setVisible(!drawerOpen);
        return super.onPrepareOptionsMenu(menu);
    }

    /**
     * When using the ActionBarDrawerToggle, you must call it during
     * onPostCreate() and onConfigurationChanged()...
     */

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        // Sync the toggle state after onRestoreInstanceState has occurred.
        mDrawerToggle.syncState();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        // Pass any configuration change to the drawer toggls
        mDrawerToggle.onConfigurationChanged(newConfig);
    }


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

//  @Override
//    public boolean onKeyDown(int keyCode, KeyEvent event) {
//        if(event.getAction() == KeyEvent.ACTION_DOWN){
//            switch(keyCode)
//            {
//            case KeyEvent.KEYCODE_BACK:
//                if(webview.canGoBack()){
//                    webview.goBack();
//                }else{
//                    finish();
//                }
//                return true;
//            }
//
//        }
//        return super.onKeyDown(keyCode, event);
//    }

}


package com.pavan.slidingmenu;

import android.app.Fragment;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebSettings;
import android.webkit.WebSettings.PluginState;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class MyWebViewFragment extends Fragment {

    ProgressDialog mProgress;
    WebView webview;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.web_fragment, container,
                false);

        Bundle bundle = getArguments();

        String url = bundle.getString("url");

        webview = (WebView) rootView.findViewById(R.id.webview1);

        WebSettings settings = webview.getSettings();
        settings.setJavaScriptEnabled(true);
        settings.setLoadWithOverviewMode(true);
        settings.setUseWideViewPort(true);
        settings.setBuiltInZoomControls(true);
        settings.setPluginState(PluginState.ON);
        mProgress = ProgressDialog.show(getActivity(), "Loading",
                "Please wait for a moment...");
        webview.loadUrl(url);

        webview.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {

                view.loadUrl(url);
                return true;
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                if (mProgress.isShowing()) {
                    mProgress.dismiss();
                }
            }
        });

        return rootView;
    }


}

1 个答案:

答案 0 :(得分:1)

您只需要让WebViewFragment实现Interface,就像这样:

public interface onBackPressedInterface
{
    public void onBackPressedWebView();
}

接口的唯一方法将在您的片段上实现,因此您必须在implements声明中添加Fragment子句,如下所示:

public class MyWebViewFragment extends Fragment implements onBackPressedInterface{

并实现如下方法:

    /**
 * the user presses the back button
 */
@Override
public void onBackPressedWebView()
{
    if (webview.canGoBack()){
        webview.goBack();
        ((MainActivity) getActivity()).canGoBack=true;
    }
    else{
        ((MainActivity) getActivity()).canGoBack=false;
        getActivity().onBackPressed();
    }
}

MainActivity中,添加一个布尔变量,用于定义是否执行正常的后退行为或在Interface上执行Fragment方法。它是公共的,因此Fragment可以访问它并在WebView上没有更多后备时修改它。在begginig中确实如此,因此在用户第一次单击后退按钮时,可以调用接口方法。

public boolean canGoBack = true;

用户点击后退按钮后,您的onBackPressed()会调用MainActivity回调,因此请将其覆盖:

@Override
public void onBackPressed()
{
    if(canGoBack)
        ((onBackPressedInterface)getSupportFragmentManager().findFragmentById(R.id.webview_fragment)).onBackPressedWebView();
    if(!canGoBack)
        super.onBackPressed();
}

R.id.webview_fragment是我在fragment布局文件中声明的Activity的ID。

因此,当用户单击后退按钮时,将调用fragment方法,它会检查webview是否可以返回。如果可以的话,返回并保持Activity布尔值为true,以便在发生新的单击时再次执行它。

WebView没有后退时,变量设置为false,并且通过调用getActivity().onBackPressed()执行正常的onBackPressed方法。

这是您的Activity布局应该是这样的,只有一个固定的Fragment组件:

<?xml version="1.0" encoding="utf-8"?>

<fragment
    android:id="@+id/webview_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    class="com.pavan.slidingmenu.MyWebViewFragment" />

如果您不想在布局中使用固定的Fragment,只需在MyWebViewFragment中创建一个电话来创建片段的实例,例如:

MyWebViewFragment.newInstance()并在Fragment

上调用接口回调