2012-04-04 19 views
13

Sto cercando di sviluppare il tipo di lettore di eBook di un'applicazione Android. Ho bisogno di dividere la stringa lunga html (inviata dal server in fase di esecuzione) in pagine al volo in base allo spazio disponibile sullo schermo. Il contenuto HTML è un articolo che potrebbe contenere testo, immagini, video, ecc. Sto usando WebView per visualizzare l'html.Dividere la stringa html in più pagine

Qualcuno può darmi indicazioni su come raggiungere questo obiettivo.

Grazie in anticipo.

+0

Puoi condividere come hai risolto questo? Grazie. – Ravi

risposta

0

È necessario analizzare l'HTML, meglio sarebbe utilizzare una libreria in cui è possibile accedere al DOM come in JavaScript. Quindi è possibile creare un layout personalizzato per il contenuto analizzato. WebView supporta JavaScript? Sarebbe un buon inizio per provarci.

Ovviamente non è possibile dividere in posizioni arbitrarie del file HTML, è necessario prendere in considerazione i tag HTML. Dopo aver modificato il DOM o diviso l'html, puoi fornire un file CSS personalizzato per il contenuto per visualizzarlo nel modo che preferisci e aggiungere un numero di paginazione usando la tua libreria o JavaScript.

Utilizzare <span style="display:none"></span> può aiutare a nascondere il contenuto in un sito Web. Quindi non è necessario dividere fisicamente (è comunque in memoria dopo aver caricato la pagina).

Spero che questo abbia aiutato un po '. Non otterrai una soluzione completa qui, ma forse hai qualche idea. Se trovi ulteriori problemi specifici, sarà più facile fare domande più specifiche.

+0

Grazie per la risposta. Con parser html di Jericho ho analizzato il codice html e ho estratto il contenuto e le immagini del testo e poi ho impostato un layout personalizzato con imageview in alto e vista testo sotto di esso. Se c'è un'immagine che sto impostando sulla vista di immagini, in caso contrario la mia textview si adatta allo schermo. – Harshita

+0

Con textview.getPaint(). MeasureText (txt) Sto ottenendo la larghezza del testo da visualizzare.Come possiamo calcolare il numero di caratteri o il testo che si adatta allo schermo. – Harshita

8

Fare qualsiasi tipo di parsing HTML/DOM ti porterà al muro, credo, e significa che stai effettivamente iniziando a sviluppare il tuo motore di layout HTML.

È un'idea migliore utilizzare le funzioni della colonna CSS3. Fondamentalmente, fai in modo che i tuoi contenuti vengano visualizzati all'interno di una colonna di larghezza e altezza fissa. Questa diventa la tua pagina. Quindi sposta la posizione del contenuto a sinistra per spostarti tra le pagine e avvolgila in un contenitore che nasconderà gli elementi di overflow.

nostro HTML sarà essenzialmente:

<body> 
    <div id="container"> 
     <div id="content"> 

      CONTENT GOES HERE 

      <span id="endMarker"></span> 
     </div> 
    </div> 
    <div> 
     <button id="previous">Previous</button> 
     <span id="page">Page N of M</span> 
     <button id="next">Next</button> 
    </div> 
</body> 

nostro CSS di base è:

#container { 
    width: 240px; 
    overflow: hidden; 
    background-color: yellow; 
} 
#content { 
    position: relative; 
    height: 30em; 

    -moz-column-width: 240px; 
    -webkit-column-width: 240px; 
    column-width: 240px; 

    -moz-column-gap: 10px; 
    -webkit-column-gap: 10px; 
    column-gap: 10px; 
} 

ora ci impostare la proprietà left CSS per il #content per passare da una pagina all'altra, in multipli di - 250px.

Dobbiamo solo capire quante colonne ci vogliono i nostri contenuti e abbiamo il paging. How to get css3 multi-column count in Javascript dà un suggerimento: lo troveremo dalla posizione sinistra di #endMarker.

Ecco un esempio operativo http://lateral.co.za/pages.html, con il primo capitolo di Moby Dick. Funziona su Chrome e su Android, ma non su Firefox - penso a causa delle differenze nelle implementazioni delle colonne CSS. Poiché siamo interessati ad Android qui, il codice è buono.

Le parti importanti sono:

  1. Le impostazioni CSS come sopra.
  2. L'aggiunta di un <span id="endMarker"></span> dopo che il contenuto (ma all'interno della #content div)
  3. L'aggiunta di un pulsante #previous e #next, e una spanna #page, tutti al di fuori del #container.
  4. Questo javascript dopo carichi jQuery:

    var _column = 0; 
    var _columnCount = 0; 
    var _columnWidth = 240; 
    var _columnGap = 10; 
    $(function() { 
        _columnCount = Math.floor($('#endMarker').position().left/(_columnWidth + _columnGap)); 
    
        setColumn = function(i) { 
         _column = i; 
         document.getElementById('content').style.left = -1 * _column * (_columnWidth + _columnGap); 
         $('#page').html('Page ' + (_column+1) + ' of ' + (_columnCount+1)); 
        } 
        $('#next').click(function() { 
         if (_column==_columnCount) return; 
         setColumn(_column+1); 
        }); 
        $('#previous').click(function() { 
         if (0==_column) return; 
         setColumn(_column-1); 
        }); 
        setColumn(0); 
    }); 
    

Questo è tutto.

C'è spazio per il lavoro. Si potrebbe voler pensare a quel numero di calcoli di colonne, io in qualche modo ho risucchiato dal post SO di riferimento, ma non ci ho ancora pensato attraverso ... La larghezza del contenitore sembra influenzare la larghezza della colonna del contenuto, che non ha assolutamente senso per me.

Ma almeno tutto sembra funzionare senza dover eseguire l'analisi e il layout HTML, almeno in Chrome e su Android.

+0

questo è davvero bello, ma come posso impostare la larghezza e l'altezza per riempire la finestra? usando 'width: $ (window) .width();' invece 'width: 240px;' e l'altra larghezza della colonna non ha funzionato. – mehdok

+0

Dovrebbe essere sufficiente per riempire la finestra. Oppure usa 'width: 100%;' o 'width: 100vw;' – craigmj

+1

ok, ma che dire '-moz-column-width: 240px; -webkit-column-width: 240px; column-width: 240px; 'se li ho impostati su 100% viene mostrata solo la prima colonna. per quanto riguarda 'height', voglio riempire sia' height' che 'width' – mehdok

Problemi correlati