GVKun编程网logo

getWindowHandles()在Firefox 58中不起作用。焦点停留在父选项卡上,并且不会转移到下一个选项卡

27

在这篇文章中,我们将为您详细介绍getWindowHandles的内容,并且讨论关于在Firefox58中不起作用。焦点停留在父选项卡上,并且不会转移到下一个选项卡的相关问题。此外,我们还会涉及一些关

在这篇文章中,我们将为您详细介绍getWindowHandles的内容,并且讨论关于在Firefox 58中不起作用。焦点停留在父选项卡上,并且不会转移到下一个选项卡的相关问题。此外,我们还会涉及一些关于Android - 查看寻呼机返回功能在前两个选项卡中不起作用、android – onCreate每次选择一个选项卡时都会调用两个选项卡、Android选项卡式活动:带有ViewPager的操作栏选项卡:每个选项卡的布局不同、Bootstrap 5 选项卡导航在 Firefox 和 Internet Explorer 中不起作用的知识,以帮助您更全面地了解这个主题。

本文目录一览:

getWindowHandles()在Firefox 58中不起作用。焦点停留在父选项卡上,并且不会转移到下一个选项卡

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 - 查看寻呼机返回功能在前两个选项卡中不起作用

Android - 查看寻呼机返回功能在前两个选项卡中不起作用

问题在于您在 FragmentTransaction 中执行 getItem。您不应该这样做:getItem 只应该创建并返回 Fragment,而让 FragmentPagerAdapter 自己处理其余的。

如果您想要默认的后退功能(离开Activity/转到之前的Activity),您可以简单地删除所有与交易相关的代码。如果您想要更多自定义功能(例如更改标签),那么您可以use OnBackPressedDispatcher to customize it。

android – onCreate每次选择一个选项卡时都会调用两个选项卡

android – onCreate每次选择一个选项卡时都会调用两个选项卡

我有一个使用片段和ActionBarSherlock构建的选项卡式应用程序.我有7个标签.这是正在发生的事情.

当我选择任何选项卡时,将按预期调用相关片段的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;
       }
    }
}
}

解决方法

标签计数将从0开始,因此在viewPager中您必须设置屏幕限制,如下所示

示例,如果您有3个标签只是给

viewPager.setoffscreenPageLimit(2);

Android选项卡式活动:带有ViewPager的操作栏选项卡:每个选项卡的布局不同

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 和 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 中不起作用的相关知识,请在本站寻找。

本文标签: