Заредете предварително WebView на фрагмент в PagerAdapter

Използвам FragmentStatePagerAdapter за изброяване на моя Fragmets в ViewPager. Всеки фрагмент съдържа само WebView. Всичко работи добре, просто искам да използвам механизма за предварително зареждане на PagerAdapter, който зарежда 1 Fragment предварително. Това е опростеният код за моя Fragment:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{
    View view = inflater.inflate(R.layout.ecard_fragment, container, false);
    webview = (WebView) view;
    webview.loadDataWithBaseURL("", HTML, "text/html", "utf-8", "");
    Toast.makeText(getActivity(), "fragment: " + NAME, Toast.LENGTH_SHORT).show();
    return view;
}

Сигурен съм, че следващото Fragment е предварително генерирано, защото Toast е показано предварително. Но WebView се зарежда по-късно - точно след като Fragment е фокусиран. Как да принудя WebView да се зареди?


person peter.bartos    schedule 29.04.2013    source източник
comment
опитвали ли сте adapter.setOffscreenPageLimit(3)?   -  person Artem Zelinskiy    schedule 29.05.2013
comment
Подозирам, че това вероятно е свързано с проблем, който имах, при който имах WebView, зададен на WRAP_CONTENT, който първоначално се оразмери като 0x0 и след като беше показан за момент, се преоразмери, за да съответства на съдържанието му. така и не намерих начин да принудя WebView да се зареди предварително или дори да открия кога е извършено зареждането. Не мисля, че има добър отговор на проблема с предварителното изготвяне на WebView.   -  person j__m    schedule 30.05.2013


Отговори (3)


Създайте своя уеб изглед в OnCreate() - метод и раздуйте този уеб изглед по-късно във вашия OnCreateView() - метод.

Вашият WebView се зарежда по-късно, защото методът onCreateView() се извиква само ако фрагментът трябва да зареди потребителския интерфейс на потребителя.

OnCreate() от друга страна се извиква преди OnCreateView() и може да инстанцира основни елементи от вашия фрагмент

person DuKes0mE    schedule 23.05.2013
comment
Благодаря ви за отговора. И така, предлагате ли да раздуете WebView в OnCreate и в OnCreateView просто да върнете предварително раздутото оформление? Опитах в момента, но поведението е същото. - person peter.bartos; 27.05.2013
comment
Хм, да, това беше моят план. Друг вариант би бил използването на вашата активност за предварително зареждане на вашия WebView и всеки път, когато промените фрагменти, той трябва да избута следващото желано съдържание към дейността и вие ще можете да получите това предварително заредено от вашата дейност. Знаеш ли какво имам предвид? - person DuKes0mE; 27.05.2013
comment
Подозирам, че WebView може да е бавният елемент, който няма да зареди съдържанието, докато не бъде поискано оформлението. - person peter.bartos; 27.05.2013
comment
Все пак трябва да е възможно. Някои ppl използват например 2 уеб изгледа (един невидим, един видим) и превключват между тези два за предварително зареждане на неща - person DuKes0mE; 27.05.2013
comment
Не избирам това като отговор, защото не е решило проблема. Но благодаря, че посочихте разликата между OnCreate и OnCreateView. - person peter.bartos; 30.05.2013

Написах прост демо проект и за мен работи добре, изгледите на квартала са предварително генерирани. Това е моят код:

public class DrawActivity extends FragmentActivity {

@Override
protected void onCreate(Bundle arg0) {
    setContentView(R.layout.pager);
    ((ViewPager) findViewById(R.id.pager)).setAdapter(new ScreenSlidePagerAdapter(getSupportFragmentManager()));
    super.onCreate(arg0);
}

private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {

    public ScreenSlidePagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        return new WebViewFragment(position);
    }

    @Override
    public int getCount() {
        return 3;
    }
}

@SuppressLint("ValidFragment")
private class WebViewFragment extends Fragment {

    private WebView mWebView;
    private int pos;

    public WebViewFragment(int pos) {
        this.pos = pos;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        mWebView = new WebView(getApplicationContext());
        mWebView.loadDataWithBaseURL("", "<h1> ----------------TEST----------------- " + pos + "</h1>", "text/html", "utf-8", "");
        Toast.makeText(getActivity(), "fragment: " + this.toString(), Toast.LENGTH_SHORT).show();
        return mWebView;
    }

}
}

и xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<android.support.v4.view.ViewPager
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

And result:

въведете описание на изображението тук

person Roman Nazarevych    schedule 29.05.2013
comment
Мисля, че това е точно това, което имах при първия си опит (преди оптимизация с onCreate вместо onCreateView). Използвайки най-новия Android API, зареждането изглежда много по-бързо и празният уеб изглед се вижда само за няколко милисекунди. Вашият уеб изглед е много по-прост, така че мисля, че се генерира веднага. - person peter.bartos; 29.05.2013

Сблъсках се със същия проблем и го поправих, като деактивирах хардуерното ускорение за WebView:

webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

чрез WebViews във ViewPager не се зареждат/изобразяват, докато е показана страница

person Sergii    schedule 05.03.2015
comment
Не помогна в моя случай, просто забави уеб изгледа изключително... - person user754730; 28.04.2020