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` 到菜单栏菜单小部件移动到错误的位置