ViewPager 上的菜单按钮敬酒位置错误

Posted

技术标签:

【中文标题】ViewPager 上的菜单按钮敬酒位置错误【英文标题】:Menu Button on ViewPager toasts wrong position 【发布时间】:2016-11-29 02:12:30 【问题描述】:

我正在使用 Viewpager 在 webview 中加载本地 html。这工作正常,正确的页面从 WebViewFragment 加载到 viewpager 活动中。滚动或滑动可以正常工作,但我添加了一个菜单按钮来获取当前 webview 的标题,并对其进行烘烤。此菜单按钮返回 viewpager 中接下来 2 个 webview 页面的 webview 标题。

将 setOfScreenLimit 减少到 1 会在 viewpager 中烘烤下一个 webview 页面的 webview 标题。我不能 setOfScreenLimit 为 0。单击菜单按钮时获取当前项目的 webview 标题的最可能方法是什么。我需要得到它并保存到数据库中。

代码:

查看页面

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) 
     

    

网页片段

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;

【问题讨论】:

我猜错误是在控制器实现中,或者在 ViewPager 设置中,但在看到一些代码之前无法确认 @Chisko 感谢您的意见。我添加了代码。请检查。 另一件事,如果按下按钮从由 WebViewFragment 膨胀的布局内部来祝酒标题,它会祝酒正确的标题。但使用菜单按钮敬酒下一个 webview 页面的磁贴。我的想法是菜单按钮由 viewpager 活动控制,因此在某种程度上会产生干扰。 【参考方案1】:

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

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

【讨论】:

谢谢,代码已添加@Ben。如果按下按钮从由 WebViewFragment 膨胀的布局内部来祝酒标题,它会祝酒正确的标题。但使用菜单按钮敬酒下一个 webview 页面的磁贴。我的想法是菜单按钮由 viewpager 活动控制,因此在某种程度上会产生干扰。【参考方案2】:

我能够用 ViewPager 解决问题。

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

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

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

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

【讨论】:

以上是关于ViewPager 上的菜单按钮敬酒位置错误的主要内容,如果未能解决你的问题,请参考以下文章

`pytestqt.mouseMove` 到菜单栏菜单小部件移​​动到错误的位置

ViewPager 滚动上的动画浮动操作按钮

原因:无法在未调用 Looper.prepare() 的线程上敬酒

饭局上都有哪些约定俗成的规矩?

当用户点击屏幕上的任意位置时调用函数

ViewPager 中的 Fragment 按钮在错误引用时触发 onClickListener