I implemented something similar with multiple TextViews. First of all, I created a ViewPager for swyping between TextViews. After that, I select the long text for several blocks, one per page. To get the text for the page, I use this function:
TextView tv = new TextView(context); //creating text view int width = mtv.getWidth() - tv.getPaddingLeft()-tv.getPaddingRight(); //get width for text int lHeight = tv.getLineHeight(); getting line height int height = ((View)mtv.getParent()).getHeight() - tv.getPaddingBottom()-tv.getPaddingTop(); // getting height of text int linesCount = (int)Math.floor((float)height/lHeight); // get line count on page String tmpText = ""; for (int i =0; i<linesCount; i++) { int index = Math.min(mtv.getLayout().getPaint().breakText(text, true, width, new float[0]), text.indexOf('\n')+1); // breaking text to lines. To use this you need mtv to be measured String t = text.substring(0, index); //getting text for this textview if (index+1 < text.length() && (text.charAt(index+1)!=' ' || text.charAt(index+1)!='\n') && t.lastIndexOf(" ")>0) index = t.lastIndexOf(" ")+1; // hack for situation when line starts with " " text = text.substring(index);//getting text for next iteration t = t.substring(0, index); tmpText+=t; } //I use spannable string for links and some styles. Recalculating spans for new indexes SpannableString s = new SpannableString(tmpText); Object os[] = spanned.getSpans(offset, offset + tmpText.length(), Object.class); for (Object o: os) { int start = spanned.getSpanStart(o)-offset; int end = spanned.getSpanEnd(o)-offset; if (start < 0) start = 0; if (end>=s.length()) end = s.length()-1; s.setSpan(o, start, end, spanned.getSpanFlags(o)); } offset+=tmpText.length(); while (text.startsWith(" ") || text.startsWith("\n")) { text = text.substring(1); offset++; } tv.setText(s);
Above, I think Google uses a TextView, not a webView. Read about Spanned and Spannable. It has the ability to display links, images, text with different styles in one text file.
source share