ViewPager上的菜单按钮提示错误的位置

时间:2016-07-25 16:15:27

标签: android android-fragments webview

我使用Viewpager在webview中加载本地htmls。这工作正常,右侧页面从WebViewFragment加载到viewpager活动。滚动或滑动工作正常,但我添加了一个菜单按钮,以获取当前webview的标题,并烘烤它。此菜单按钮返回viewpager中下两个webview页面的webview标题。

将setOfScreenLimit减少为1,以在viewpager中提供下一个webview页面的webview标题。我无法将setOfScreenLimit设置为0.当单击菜单按钮时,获取当前项目的webview标题的最可能方式是什么。我需要得到这个并保存到数据库。

代码:

ViewPager

ViewPager pager = (ViewPager) findViewById(R.id.pager);
    TabsPagerAdapterEnglish pageAdapter = new TabsPagerAdapterEnglish(getSupportFragmentManager());

    Bundle extras = getIntent().getExtras();
    int value = 0;
    if (extras != null) {
        value = extras.getInt("keyHTML");
    }

    pager.setAdapter(pageAdapter);
    pager.setCurrentItem(value);
    pager.setOffscreenPageLimit(1);

适配器

public class TabsPagerAdapterEnglish extends FragmentPagerAdapter {
    private static int NUM_ITEMS = 3

    public TabsPagerAdapterEnglish(FragmentManager fragmentManager) {
        super(fragmentManager);
    }

    // Returns total number of pages
    @Override
    public int getCount() {
        return NUM_ITEMS;
    }

    // Returns the fragment to display for that page
    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0:
                return WebFragmentEnglish.newInstance(0, "file:///android_asset/page1.html");
            case 1:
                return WebFragmentEnglish.newInstance(1, "file:///android_asset/page2.html");
            case 2:
                return WebFragmentEnglish.newInstance(2, "file:///android_asset/page3.html");

            default:
                return null;
        }
    }

    @Override
    public CharSequence getPageTitle(int position) {
     }

    }

WebFragment

public class WebFragmentEnglish extends Fragment {

// newInstance constructor for creating fragment with arguments
public static WebFragmentEnglish newInstance(int position, String url) {
    WebFragmentEnglish fragmentFirst = new WebFragmentEnglish();
    Bundle args = new Bundle();
    args.putInt("page_position", position);
    args.putString("keyHTML", url);
    fragmentFirst.setArguments(args);
    return fragmentFirst;
}

// Store instance variables based on arguments passed
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);

    Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar);

    if (null != toolbar) {
        toolbar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
    }

    position = getArguments().getInt("page_position", 0);
    url = getArguments().getString("keyHTML");

    toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
        @Override
        public boolean onMenuItemClick(MenuItem item) {
            switch (item.getItemId()) {
                case android.R.id.home:
                    getActivity().finish();
                case R.id.action_addtofav:
                    webView = (WebView) getActivity().findViewById(R.id.webView1);
                    htitle = webView.getTitle();
                    saveData();
                    Toast.makeText(getActivity(), htitle + " added to favorite",
                            Toast.LENGTH_SHORT).show();
                    return true;
            }
            return false;
        }
    });
}

// Inflate the view for the fragment based on layout XML
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.webview, container, false);

    webView = (WebView) view.findViewById(R.id.webView1);
    progressBar = (ProgressBar) view.findViewById(R.id.progressBar);

    progressBar.setMax(100);

    webView.setWebViewClient(new WebViewClientDemo());
    webView.setWebChromeClient(new WebChromeClientDemo());
    webView.setInitialScale(1);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.getSettings().setLoadWithOverviewMode(true);
    webView.getSettings().setUseWideViewPort(true);
    webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
    webView.getSettings().setPluginState(WebSettings.PluginState.ON);
    webView.getSettings().setLoadsImagesAutomatically(true);
    webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
    webView.setScrollbarFadingEnabled(false);
    webView.getSettings().setBuiltInZoomControls(true);
    webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
    webView.setOnLongClickListener(new View.OnLongClickListener() {

        @Override
        public boolean onLongClick(View arg0) {
            // TODO Auto-generated method stub
            return true;
        }
    });
    webView.setLongClickable(false);
    webView.setWebChromeClient(new WebChromeClient() {
        public void onProgressChanged(WebView view, int progress) {

            progressBar.setProgress(progress);

        }
    });
    webView.loadUrl(url);
    return view;
}

2 个答案:

答案 0 :(得分:0)

ViewPager会将当前页面和下一页面加载到offScreenLimit。要获取当前页面的名称,您需要获取适配器的当前位置。

如果没有发布代码,很难提供更具体的帮助。但是您可以使用ViewPager getCurrentItem方法来获取可见索引。从那里你可以将它与你正在显示的页面的索引进行比较(如果视图寻呼机是静态的并且页面是预先知道的,这是有效的),或者你可以使用该索引从PagerAdapter获取片段并调用保存名称的方法。

答案 1 :(得分:0)

我能够用ViewPager解决问题。

我从片段中删除了工具栏实例,以使用viewpager活动中的工具栏实例。然后在我的选项菜单中,您会注意到我使用了

webView = (WebView) **getActivity().**findViewById(R.id.webView1);

我完全删除了这个,因为我已经在onCreateView中定义了它,我想也许是因为我添加的getActivity字段来定位webview ID。

我正在更新旧代码,我很高兴我能够解决这个问题。谢谢@Chisko和@Ben