【问题标题】:Set page title of WebView from fragment从片段中设置 WebView 的页面标题
【发布时间】:2013-03-31 00:46:52
【问题描述】:

我有一个ViewPager,每个视图都是一个WebView。如果用户单击WebViews 之一中的链接,我想将Actionbar 的标题设置为当前网页。

我希望我可以使用shouldOverrideUrlLoading 来做到这一点,但页面标题始终是前一页。因此,如果用户单击链接 1、链接 2 和链接 3。在第 3 页上,链接 2 的标题显示在 Actionbar 中。

如果我将标题设置代码放在onPageFinished 中,页面标题将设置为ViewPager 的下一个视图,因为ViewPager 执行上一个/下一个视图以提高性能。

片段

public class Browser extends SherlockFragment {

    private OnBrowserSetTitle mBrowserSetTitle;

   @Override
    public void onAttach(Activity act) {
        super.onAttach(act);
        mBrowserSetTitle = (OnBrowserSetTitle)act;
    }

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);

        activity = getActivity();

        setHasOptionsMenu(true);

        mWebView = (WebView)getView().findViewById(R.id.webview);
        mWebView.loadUrl("http://www.google.com");

        mWebView.setWebViewClient(new WebViewClient() {

            public void onPageFinished(WebView view, String url) {

            }

             @Override
             public boolean shouldOverrideUrlLoading(WebView view, String url) {
                  view.loadUrl(url);
                  if (view.getTitle() != null && view.getTitle().length() > 0)
                  {
                      mBrowserSetTitle.onBrowserSetTitle(mTitle);
                  }

                 return true;
             }            
        });
    }
}

活动

public class BrowserPager extends SherlockFragmentActivity implements Interfaces.OnBrowserSetTitle {

    @Override
    public void onCreate(final Bundle icicle)
    {    
        super.onCreate(icicle);

        setContentView(R.layout.browser_pager);
    }

    @Override
    public void onBrowserSetTitle(String title) {
        getSupportActionBar().setTitle(title);
    }
}

【问题讨论】:

    标签: android android-webview actionbarsherlock android-viewpager


    【解决方案1】:

    onBrowserSetTitle 更改为具有以下定义:

    @Override
    public void onBrowserSetTitle(String title, View view) {
        if (mViewPager.getCurrentItem() == mViewPager.getAdapter().getItemPosition(view)) {
            getSupportActionBar().setTitle(title);
        }
    }
    

    然后像这样从onPageFinished 调用onBrowserSetTitle

    @Override
    public void onPageFinished(WebView view, String url) {
        if (view.getTitle() != null && view.getTitle().length() > 0) {
            mBrowserSetTitle.onBrowserSetTitle(mTitle, view);
        }
    }   
    

    【讨论】:

    • 我想你可能会感到困惑。当用户在视图之间滑动时,我可以处理页面标题,但是如果用户在一个特定的 WebView 上并单击网页本身的链接,那就是我遇到问题的地方。
    • 感谢您的回复。如果您在我最初的问题中注意到,我尝试了onPageFinished,但是,使用ViewPagers 的工作方式,他们执行上一个和下一个视图,以提高性能,所以如果我在onPageFinished 中设置标题,当用户滑动,标题显示错误的标题。
    • @KrisB 我明白这一点,但这将检查试图设置标题的视图是否是当前显示的视图,因此不应将标题设置为任何视图的标题不是当前显示的。
    • 抱歉,没有看到您检查当前项目的位置。我实现了代码,你知道为什么mViewPager.getAdapter().getItemPosition(view)总是返回-1吗?
    • @KrisB 我认为您必须在 PagerAdapter 中覆盖 getItemPosition 才能返回视图的正确位置。
    猜你喜欢
    • 2010-09-10
    • 1970-01-01
    • 2016-12-17
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-16
    • 1970-01-01
    相关资源
    最近更新 更多