在这篇文章中,我们将为您详细介绍getWindowHandles的内容,并且讨论关于在Firefox58中不起作用。焦点停留在父选项卡上,并且不会转移到下一个选项卡的相关问题。此外,我们还会涉及一些关
在这篇文章中,我们将为您详细介绍getWindowHandles的内容,并且讨论关于在Firefox 58中不起作用。焦点停留在父选项卡上,并且不会转移到下一个选项卡的相关问题。此外,我们还会涉及一些关于Android - 查看寻呼机返回功能在前两个选项卡中不起作用、android – onCreate每次选择一个选项卡时都会调用两个选项卡、Android选项卡式活动:带有ViewPager的操作栏选项卡:每个选项卡的布局不同、Bootstrap 5 选项卡导航在 Firefox 和 Internet Explorer 中不起作用的知识,以帮助您更全面地了解这个主题。
本文目录一览:- getWindowHandles()在Firefox 58中不起作用。焦点停留在父选项卡上,并且不会转移到下一个选项卡
- Android - 查看寻呼机返回功能在前两个选项卡中不起作用
- android – onCreate每次选择一个选项卡时都会调用两个选项卡
- Android选项卡式活动:带有ViewPager的操作栏选项卡:每个选项卡的布局不同
- Bootstrap 5 选项卡导航在 Firefox 和 Internet Explorer 中不起作用
getWindowHandles()在Firefox 58中不起作用。焦点停留在父选项卡上,并且不会转移到下一个选项卡
我开始学习如何使用带Java的Selenium在浏览器中处理多个选项卡。看起来我下面的代码无法正常工作。
import java.util.ArrayList; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; public class HandlingWindows { public static void main(String[] args) throws InterruptedException { WebDriver driver= new FirefoxDriver(); driver.get("https://www.facebook.com/"); String parent= driver.getWindowHandle(); System.out.println("Parent Window is"+parent); //Get Data Policy WebElement we= driver.findElement(By.linkText("Data Policy")); //Click Data Policy link we.click(); //Create an arrayList ArrayList<String> s1= new ArrayList<String>(driver.getWindowHandles()); for(String s2:s1) { if(!(s2.equalsIgnoreCase(parent))) { driver.switchTo().window(s2); Thread.sleep(5000); System.out.println(driver.getWindowHandle()); System.out.println("get title of window"+driver.getTitle()); } } }}
请让我知道如何在不使用getWindowHandles()的情况下显示标题“数据策略”。
答案1
小编典典getWindowHandles()
可以正常工作,但是在调用之前,getWindowHandles()
您必须按照以下步骤诱使
WebDriverwait :
System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe");WebDriver driver= new FirefoxDriver();driver.get("https://www.facebook.com/");String parent= driver.getWindowHandle();System.out.println("Parent Window is"+parent);driver.findElement(By.linkText("Data Policy")).click();WebDriverWait wait = new WebDriverWait(driver,5);wait.until(ExpectedConditions.numberOfWindowsToBe(2));Set<String> s1= driver.getWindowHandles();for(String s2:s1){ if(!parent.equalsIgnoreCase(s2)) { driver.switchTo().window(s2); Thread.sleep(5000); System.out.println(driver.getWindowHandle()); System.out.println("get title of window"+driver.getTitle()); }}
控制台输出:
Parent Window is42949672974294967303get title of windowData Policy
Android - 查看寻呼机返回功能在前两个选项卡中不起作用
问题在于您在 FragmentTransaction
中执行 getItem
。您不应该这样做:getItem
只应该创建并返回 Fragment
,而让 FragmentPagerAdapter
自己处理其余的。
如果您想要默认的后退功能(离开Activity
/转到之前的Activity
),您可以简单地删除所有与交易相关的代码。如果您想要更多自定义功能(例如更改标签),那么您可以use OnBackPressedDispatcher
to customize it。
android – onCreate每次选择一个选项卡时都会调用两个选项卡
当我选择任何选项卡时,将按预期调用相关片段的onCreate方法.问题是也为下一个相邻的选项卡调用onCreate方法.例如:
>应用程序在tab1中启动,onCreate按预期调用
> tab2 onCreate也被调用(不应该发生)
> ——-
>单击tab2并按预期调用onCreate(即使它已被调用)
> tab3 onCreate也被调用(不应该发生)
> ——-
>单击tab6,按预期调用onCreate
> tab7 onCreate也被调用(不应该发生)
> ——-
>真的很奇怪,点击tab7(最后一个标签)
> tab6(第二个到最后一个标签)onCreate也被调用(不应该发生)
我已经阅读了几个可能的问题并检查以确保它不会发生在这里:
>不为每个标签使用唯一标签(它们是唯一的)
>模拟器有两次调用onCreate的错误(我的ICS设备上的行为相同)
所以这不是以前的两种可能性,而且我完全没有想法.该程序运行正常,但加载两个片段(这是Webview)需要花费太多时间,而不是我期望的行为.
这是我创建标签主机的主要活动onCreate的代码:
编辑:
public class SynergyWorldwideActivity extends SherlockFragmentActivity { //TabHost mTabHost; ViewPager mViewPager; TabsAdapter mTabsAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Set up the view pager setContentView(R.layout.fragment_tabs_pager); mViewPager = (ViewPager)findViewById(R.id.pager); // Set up action bar final ActionBar bar = getSupportActionBar(); bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); bar.setdisplayShowTitleEnabled(true); //bar.setdisplayShowHomeEnabled(false); // Creat tabs with bundled URLs Bundle tab1Args=new Bundle(),tab2Args=new Bundle(),tab3Args=new Bundle(),tab4Args=new Bundle(),tab5Args=new Bundle(),tab6Args=new Bundle(),tab7Args=new Bundle(); tab1Args.putString("tabURL",getString(R.string.webtab1_URL)); tab2Args.putString("tabURL",getString(R.string.webtab2_URL)); tab3Args.putString("tabURL",getString(R.string.webtab3_URL)); tab4Args.putString("tabURL",getString(R.string.webtab4_URL)); tab5Args.putString("tabURL",getString(R.string.webtab5_URL)); tab6Args.putString("tabURL",getString(R.string.webtab6_URL)); tab7Args.putString("tabURL",getString(R.string.webtab7_URL)); mTabsAdapter = new TabsAdapter(this,mViewPager); mTabsAdapter.addTab(bar.newTab().setText(getString(R.string.webtab1_name)),WebTabFragment.MyWebviewFragment.class,tab1Args); mTabsAdapter.addTab(bar.newTab().setText(getString(R.string.webtab2_name)),tab2Args); mTabsAdapter.addTab(bar.newTab().setText(getString(R.string.webtab3_name)),tab3Args); mTabsAdapter.addTab(bar.newTab().setText(getString(R.string.webtab4_name)),tab4Args); mTabsAdapter.addTab(bar.newTab().setText(getString(R.string.webtab5_name)),tab5Args); mTabsAdapter.addTab(bar.newTab().setText(getString(R.string.webtab6_name)),tab6Args); mTabsAdapter.addTab(bar.newTab().setText(getString(R.string.webtab7_name)),tab7Args); if (savedInstanceState != null) { bar.setSelectednavigationItem(savedInstanceState.getInt("tab",0)); } } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt("tab",getActionBar().getSelectednavigationIndex()); } /** * This is a helper class that implements the management of tabs and all * details of connecting a ViewPager with associated TabHost. It relies on a * trick. normally a tab host has a simple API for supplying a View or * Intent that each tab will show. This is not sufficient for switching * between pages. So instead we make the content part of the tab host * 0dp high (it is not shown) and the TabsAdapter supplies its own dummy * view to show as the tab content. It listens to changes in tabs,and takes * care of switch to the correct paged in the ViewPager whenever the selected * tab changes. */ public static class TabsAdapter extends FragmentPagerAdapter implements ActionBar.TabListener,ViewPager.OnPagechangelistener{ private final Context mContext; //private final TabHost mTabHost; private final ActionBar mActionBar; private final ViewPager mViewPager; private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>(); static final class TabInfo { private final Class<?> clss; private final Bundle args; TabInfo(Class<?> _class,Bundle _args) { clss = _class; args = _args; } } public TabsAdapter(FragmentActivity activity,ViewPager pager) { super(activity.getSupportFragmentManager()); mContext = activity; mActionBar = ((SherlockFragmentActivity) activity).getSupportActionBar(); mViewPager = pager; mViewPager.setAdapter(this); mViewPager.setonPagechangelistener(this); } public void addTab(ActionBar.Tab tab,Class<?> clss,Bundle args) { TabInfo info = new TabInfo(clss,args); tab.setTag(info); tab.setTabListener(this); mTabs.add(info); mActionBar.addTab(tab); notifyDataSetChanged(); } @Override public int getCount() { int iCount = mTabs.size(); return iCount; } @Override public Fragment getItem(int position) { TabInfo info = mTabs.get(position); return Fragment.instantiate(mContext,info.clss.getName(),info.args); } @Override public void onPageScrolled(int position,float positionOffset,int positionOffsetPixels) { } @Override public void onPageSelected(int position) { mActionBar.setSelectednavigationItem(position); } @Override public void onPageScrollStateChanged(int state) { } @Override public void onTabSelected(Tab tab) { Object tag = tab.getTag(); for (int i=0; i<mTabs.size(); i++) { if (mTabs.get(i) == tag) { mViewPager.setCurrentItem(i); } } } @Override public void onTabUnselected(Tab tab) { } @Override public void onTabReselected(Tab tab) { } } }
这是选项卡片段的代码:
编辑:
public class WebTabFragment extends SherlockFragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if(savedInstanceState == null) { FragmentManager fm = getSupportFragmentManager(); if (fm.findFragmentById(android.R.id.content) == null) { MyWebviewFragment myWebView = new MyWebviewFragment(); fm.beginTransaction().add(android.R.id.content,myWebView).commit(); } } } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); //outState.putString("tabNumber",mTabNumber); } public static class MyWebviewFragment extends SherlockFragment { final static private String tag = MyWebviewFragment.class.getSimpleName(); String mTabURL; private WebView mWebView = null; static final int REFRESH_ID = Menu.FirsT; private ProgressDialog spinnerDlg; @Override public void onSaveInstanceState(Bundle outState) { if(mWebView.saveState(outState) == null) Log.i(tag,"Saving state Failed!"); else Log.i(tag,"Saving state succeeded."); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setHasOptionsMenu(true); } @Override public void onCreateOptionsMenu(Menu menu,MenuInflater inflater) { menu.add(Menu.NONE,REFRESH_ID,getString(R.string.refresh_string)) .setIcon(R.drawable.ic_action_refresh) .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); } @Override public boolean onoptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case REFRESH_ID: if(mWebView != null) mWebView.reload(); return true; default: return super.onoptionsItemSelected(item); } } /** * When creating,retrieve this instance''s number from its arguments. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Tell the framework to try to keep this fragment around // during a configuration change. setRetainInstance(true); mTabURL = getArguments() != null ? getArguments().getString("tabURL") : "http://www.google.com"; } /** * The Fragment''s UI is just a simple text view showing its * instance number. */ @Override public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) { // Create view object to return View v = inflater.inflate(R.layout.webview_layout,container,false); // Set up webview object if (mWebView != null) { mWebView.destroy(); } mWebView = (WebView)v.findViewById(R.id.webview_fragment); mWebView.getSettings().setJavaScriptEnabled(true); mWebView.setonKeyListener(new OnKeyListener(){ @Override public boolean onKey(View v,int keyCode,KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) { mWebView.goBack(); return true; } return false; } }); // Check to see if it has been saved and restore it if true if(savedInstanceState != null) { if (savedInstanceState.isEmpty()) Log.i(tag,"Can''t restore state because bundle is empty."); else { if (mWebView.restoreState(savedInstanceState) == null) Log.i(tag,"Restoring state Failed!"); else Log.i(tag,"Restoring state succeeded."); } } else { // Load web page mWebView.setWebViewClient(new MyWebViewClient()); mWebView.getSettings().setPluginsEnabled(true); mWebView.getSettings().setBuiltInZoomControls(false); mWebView.getSettings().setSupportZoom(false); mWebView.getSettings().setJavaScriptCanopenWindowsAutomatically(true); mWebView.getSettings().setAllowFileAccess(true); mWebView.getSettings().setDomStorageEnabled(true); mWebView.loadUrl(mTabURL); } return v; } @Override public void onDestroy() { super.onDestroy(); } @Override public void onDestroyView() { super.onDestroyView(); } @Override public void onPause() { super.onPause(); } @Override public void onResume() { super.onResume(); } @Override public void onConfigurationChanged(Configuration newConfig) { // Todo Auto-generated method stub super.onConfigurationChanged(newConfig); } public class MyWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view,String url) { // YouTube video link if (url.startsWith("http://youtu.be")) { String urlSubString = url.substring("http://youtu.be/".length()); String newURL = String.format("http://www.youtube.com/v/%s",urlSubString); startActivity(new Intent(Intent.ACTION_VIEW,Uri.parse(newURL))); return (true); } return (false); } @Override public void onPageStarted(WebView view,String url,Bitmap favicon) { super.onPageStarted(view,url,favicon); if(spinnerDlg == null) { spinnerDlg = new ProgressDialog(getActivity()); spinnerDlg.setMessage("Loading...."); spinnerDlg.show(); } } @Override public void onPageFinished(WebView view,String url) { super.onPageFinished(view,url); if(spinnerDlg != null) { spinnerDlg.dismiss(); } spinnerDlg = null; } } } }
解决方法
示例,如果您有3个标签只是给
viewPager.setoffscreenPageLimit(2);
Android选项卡式活动:带有ViewPager的操作栏选项卡:每个选项卡的布局不同
我完全停电,我不熟悉使用碎片.
我用eclipse助手创建了一个新的Android项目:
这里是创建的默认类的片段:
/**
* A {@link FragmentPagerAdapter} that returns a fragment corresponding to
* one of the sections/tabs/pages.
*/
public class SectionsPagerAdapter extends FragmentPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
// getItem is called to instantiate the fragment for the given page.
// Return a PlaceholderFragment (defined as a static inner class
// below).
return PlaceholderFragment.newInstance(position + 1);
}
@Override
public int getCount() {
// Show 3 total pages.
return 3;
}
@Override
public CharSequence getPageTitle(int position) {
Locale l = Locale.getDefault();
switch (position) {
case 0:
return getString(R.string.title_section1).toupperCase(l);
case 1:
return getString(R.string.title_section2).toupperCase(l);
case 2:
return getString(R.string.title_section3).toupperCase(l);
}
return null;
}
}
/**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment {
/**
* The fragment argument representing the section number for this
* fragment.
*/
static int sec;
private static final String ARG_SECTION_NUMBER = "section_number";
/**
* Returns a new instance of this fragment for the given section number.
*/
public static PlaceholderFragment newInstance(int sectionNumber) {
sec = sectionNumber;
Log.i("ARG_SECTION_NUMBER"," "+sec);
PlaceholderFragment fragment = new PlaceholderFragment();
Bundle args = new Bundle();
args.putInt(ARG_SECTION_NUMBER, sectionNumber);
fragment.setArguments(args);
return fragment;
}
public PlaceholderFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
int jjj = sec;
Log.i("onCreateView"," "+sec);
View rootView = inflater.inflate(R.layout.fragment_main, container,
false);
return rootView;
}
}
SectionsPagerAdapter用作适配器并返回Fragments
3个片段具有相同的布局
fragment_main.xml
如何将不同的布局分配给3个片段?
PlaceholderFragment包含一个带有section_number的Bundle:
args.putInt(ARG_SECTION_NUMBER, sectionNumber);
我可以使用此信息来确定每个片段中显示的布局吗?
// Create the adapter that will return a fragment for each of the three
// primary sections of the activity.
mSectionsPagerAdapter = new SectionsPagerAdapter(
getSupportFragmentManager());
// Set up the ViewPager with the sections adapter.
mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(mSectionsPagerAdapter);
解决方法:
您需要为每个页面创建不同的类.页面从片段扩展.您可以为每个片段加载不同的layout-xml.
public class FirstFragment extends Fragment{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.<yourxmlhere>, container,
false);
return rootView;
}
}
你知道有片段,但你的适配器仍然需要知道哪个页面(位置)是哪个片段.这由以下函数决定:
@Override
public Fragment getItem(int position) {
switch (position){
case 0:
//page 1
return new FirstFragment();
break;
case 1:
//page 2
return new SecondFragment();
break;
default:
//this page does not exists
return null;
}
确保您已设置正确的页面数量!
@Override
public int getCount() {
//the amount of pages your adapter kNows
return <youramountofpages>;
}
这应该让你开始运行.
编辑:您可以删除整个placeholderfragment类.它不再需要了.
Bootstrap 5 选项卡导航在 Firefox 和 Internet Explorer 中不起作用
如何解决Bootstrap 5 选项卡导航在 Firefox 和 Internet Explorer 中不起作用?
我使用的是 Bootstrap 5 导航标签,但这些标签在 Firefox 89.0.2 和 Internet Explorer 11+ 上没有变化。控制台中没有错误。
cdn js:
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/js/bootstrap.bundle.min.js"></script>
html:
<nav>
<divid="dvtabs" role="tablist">
<buttonid="nav-contact-tab" data-bs-toggle="tab" data-bs-target="#nav-contact" type="button" role="tab" aria-controls="nav-contact" aria-selected="true">C</button>
<buttonid="nav-associate-tab" data-bs-toggle="tab" data-bs-target="#nav-associate" type="button" role="tab" aria-controls="nav-associate" aria-selected="false">A</button>
</div>
</nav>
<divid="dvtabcontent">
<divid="nav-contact" role="tabpanel" aria- labelledby="nav-contact-tab"></div>
<divid="nav-associate" role="tabpanel" aria- labelledby="nav-associate-tab"></div>
</div>
解决方法
经过简单的测试,我发现它在FireFox中可以正常工作(参考jquery 3.6.0和bootstrap.css/js 5.0.1)。我不确定您是否引用了 jquery 和 bootstrap.css。但它在 IE11 中不起作用。根据控制台中的错误信息,我认为问题的原因是IE不支持箭头功能。
如果你需要使用bootstrap来实现这样的功能,我推荐你使用bootstrap4。经测试,在IE11中使用bootstrap4可以正常工作。
简单测试:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
</head>
<body>
<nav>
<divid="nav-tab" role="tablist">
<buttonid="nav-home-tab" data-toggle="tab" href="#nav-contact" role="tab" aria-controls="nav-home" aria-selected="true">C</button>
<buttonid="nav-profile-tab" data-toggle="tab" href="#nav-associate" role="tab" aria-controls="nav-profile" aria-selected="false">A</button>
</div>
</nav>
<divid="dvtabcontent">
<divid="nav-contact" role="tabpanel" aria- labelledby="nav-contact-tab">panel C</div>
<divid="nav-associate" role="tabpanel" aria- labelledby="nav-associate-tab">panel A</div>
</div>
</body>
</html>
关于getWindowHandles和在Firefox 58中不起作用。焦点停留在父选项卡上,并且不会转移到下一个选项卡的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Android - 查看寻呼机返回功能在前两个选项卡中不起作用、android – onCreate每次选择一个选项卡时都会调用两个选项卡、Android选项卡式活动:带有ViewPager的操作栏选项卡:每个选项卡的布局不同、Bootstrap 5 选项卡导航在 Firefox 和 Internet Explorer 中不起作用的相关知识,请在本站寻找。
本文标签: