2016-05-10 14 views
5

Ho una piccola webView in uno dei miei layout che fungono da feed di notizie dal mio sito Web. Ogni volta che ho cambiato la rotazione, ricaricherei la pagina web.come posso salvare lo stato della mia webview quando cambi orientamento usando un webviewfragment

così ho modificato il codice per includere un cambio di configurazione e lo stato di ripristino. Quindi ho regolato il mio manifest Android per includere le modifiche di configurazione che dal sito dev dicono di includere l'orientamento e le dimensioni dello schermo.

Questo risolve il problema del salvataggio dello stato, ma a sua volta crea un nuovo problema che è che ho layout di dimensioni diverse per quando è in modalità orizzontale su determinati dispositivi. ma con il manifest impostato come sostituisce la dimensione dello schermo. è lì per salvare lo stato ma senza usare la dimensione dello schermo nel mio manifest. quindi potrei usare il mio layout di paesaggio

ecco il mio codice per le modifiche di orientamento.

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 

    // Checks the orientation of the screen 
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { 
     Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show(); 

    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { 
     Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show(); 
    } 
} 

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



    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 

    setContentView(R.layout.activity_homescreen); 
    if (savedInstanceState != null) 
     ((WebView)findViewById(R.id.neweview)).restoreState(savedInstanceState); 
    svHomeScreen = (ScrollView) findViewById(R.id.svHomeScreen); 
    svHomeScreen.setScrollbarFadingEnabled(false); 

    wv = (WebView) findViewById(R.id.neweview 
    ); 
    wv.setScrollbarFadingEnabled(false); 

    wv.getSettings().setJavaScriptEnabled(true); 
    wv.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 
    wv.getSettings().setRenderPriority(WebSettings.RenderPriority.NORMAL); 
    wv.getSettings().setLoadsImagesAutomatically(true); 
    wv.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT); 

    if (Build.VERSION.SDK_INT >= 19) { 
     // chromium, enable hardware acceleration 
     wv.setLayerType(View.LAYER_TYPE_HARDWARE, null); 
    } else { 
     // older android version, disable hardware acceleration 
     wv.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 
    } 
    wv.canGoBackOrForward(5); 
    wv.getSettings().setLoadWithOverviewMode(true); 
    wv.getSettings().setUseWideViewPort(true); 
    wv.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); 


    wv.setPadding(0, 0, 0, 0); 
    wv.loadUrl(NEWS); 

poi il mio file manifesto ha

<activity 
     android:name=".Homescreen" 
     android:label="@string/title_activity_homescreen" 
     android:configChanges="keyboard|keyboardHidden|orientation|screenSize" 
     /> 

ive ha aggiunto un contenitore di un frammento vista web, ma ora la vista scompare quando la rotazione è il paesaggio. poi scompare completamente quando torno indietro. così ho provato ad aggiungere lo stato e SaveState salva dalla ad esso, che caricato il WebView quando viene ruotato di paesaggio, ma si è schiantato l'applicazione quando si va di nuovo al ritratto

+0

Avete provato ad aggiungere 'Android: configChanges = "orientamento | Screensize"' nel tag '' (manifesto)? –

+0

sì lo ha provato e salva lo stato ma sovrascrive le mie schermate e questo è il mio problema se elimino l'opzione | screensize che ritorna indietro per non salvare lo stato –

+2

Si potrebbe provare a collocarlo all'interno di un frammento - i frammenti non vengono ricreati come brutalmente come Attività quando lo schermo viene ruotato. Potresti scoprire che la webview all'interno di un frammento sopravvive perfettamente alla rotazione. – adelphus

risposta

2

Ecco un esempio di codice che posiziona la WebView nel layout dell'attività come un frammento. In modalità verticale, la vista è centrata, in orizzontale, è posizionata in basso. Entrambi gli orientamenti utilizzano la stessa singola istanza di WebView.

public class MainActivity extends Activity 
{ 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     // load the fragment - we only need to do this when the activity is first created 
     // - not on a recreation due to screen rotation, etc 
     if (savedInstanceState == null) { 
      FragmentManager fm = this.getFragmentManager(); 
      FragmentTransaction ft = fm.beginTransaction(); 
      ft.add(R.id.container, new WebViewFragment()); 
      ft.commit(); 
     } 

    } 

    // this could go in a separate file 
    public static class WebViewFragment extends Fragment { 
     WebView mWebView; 

     @Override 
     public View onCreateView(LayoutInflater layoutInflater, ViewGroup viewGroup, Bundle bundle) { 
      View v = layoutInflater.inflate(R.layout.webviewfrag, null, false); 
      this.mWebView = (WebView)v.findViewById(R.id.NewsFeedWbview); 
      this.mWebView.loadUrl("https://google.com"); 
      return v; 
     } 

    } 
} 

res/layout/main.xml (modalità di default/portrait)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 
    <!-- container layout for the webview fragment 
    - note the id for this view is the same in both this and the landscape version --> 
    <FrameLayout 
    android:id="@+id/container" 
    android:layout_width="match_parent" 
    android:layout_height="240dp" 
    android:layout_centerVertical="true" 
    /> 

</RelativeLayout> 

res/layout terra/principale.xml (paesaggio)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 
    <!-- container layout for the webview fragment 
    - note the id for this view is the same in both this and the portrait version --> 
    <FrameLayout 
    android:id="@+id/container" 
    android:layout_width="match_parent" 
    android:layout_height="100dp" 
    android:layout_alignParentBottom="true" 
    /> 

</RelativeLayout> 

res/layout/webviewfrag.xml

<!-- make the WebView fill its container --> 
    <WebView 
     xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@+id/NewsFeedWbview" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
     /> 
+0

grazie @adelphus proverò qualcosa come questo ora –

+0

@: adelphus ho provato questa ultima notte, ma quando io ruotare lo schermo la vista scompare completamente. C'è qualcos'altro da provare –

+0

Ive ha anche provato ad aggiungere lo stato di salvataggio e salvataggio al webviewFragment. che fa apparire la webview in entrambe le viste. ma dosent salva lo stato e arresta anche l'app quando si torna in verticale –

0

Penso che si possa risolvere semplicemente tutti voi i problemi con l'aggiunta di Android: configChanges per la vostra attività in AndroidManifest.xml come questo:

<activity 
     android:name=".activities.MyActivity" 
     android:configChanges="keyboardHidden|orientation|screenSize" 
     android:label="" 
     android:theme="@style/MyTheme" 
     android:parentActivityName=".activities.Home"> 
    </activity> 
+0

scusa modificheremo il post che ho incluso –

0

Ok ragazzi così ive sussed utilizzando frammenti per WebView. Ho realizzato due frammenti, uno chiamato webivew e uno chiamato webviewfragmentlandscape.

quindi in the on ho caricato entrambi i frammenti ma rendiamo il paesaggio invisibile fino a quando il dispositivo non entra per atterrare scape usando il metodo di configurazione che stavo già usando. ecco il mio nuovo codice, se qualsiasi organismo può migliorare ciò che ive doen sarebbe un grande aiuto

questo è prima onCreate

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    View Sidepane = findViewById(R.id.NewsFeed); 
    View Squarepane = findViewById(R.id.NewsFeed2); 

    // Checks the orientation of the screen 
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { 
     Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show(); 


     if (Sidepane.getVisibility() == View.VISIBLE) { 
      Sidepane.setVisibility(View.GONE);} 

     Squarepane.setVisibility(View.VISIBLE); 


    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { 
     Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show(); 

     if (Squarepane.getVisibility() == View.VISIBLE) { 
      Squarepane.setVisibility(View.GONE); 

      Sidepane.setVisibility(View.VISIBLE); 


     } 

questo è nel su Crea

View Sidepane = findViewById(R.id.NewsFeed); 
    View Squarepane = findViewById(R.id.NewsFeed2); 

    Squarepane.setVisibility(View.GONE); 
    Sidepane.setVisibility(View.VISIBLE); 

e questo è il frammento di ritratto

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


    <WebView 
    android:layout_width="match_parent" 
    android:layout_height="240dp" 
    android:id="@+id/NewsFeedWbview" 
    android:layout_gravity="center_vertical" 
    android:layout_alignParentBottom="true" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true"> 

    </WebView> 
</RelativeLayout> 

infine il frammento di paesaggio

<?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"> 

    <WebView 
    android:layout_width="match_parent" 
    android:layout_height="100dp" 
    android:id="@+id/NewsFeedWbview2" 

    android:layout_alignParentBottom="true" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" 
    android:layout_gravity="bottom"> 

    </WebView> 
</LinearLayout> 
+1

Cosa hai fatto funzionerà, ma non è l'ideale perché hai caricato 2 frammenti per la stessa cosa che non dovrebbe essere necessaria. Normalmente si creano due layout per l'attività (uno normale, uno orizzontale) con tutte le dimensioni di layout personalizzate per ciascuno e poi si gonfia/si carica un frammento * singolo * (con la propria webview) all'interno di 'onCreate()'. Quando lo schermo ruota, Android caricherà il layout alternativo per l'attività, ma trasferirà automagicamente il frammento nel suo nuovo contenitore di layout (gli ID nei due layout devono corrispondere) senza che tu debba fare altro. – adelphus

+0

Se ciò non avesse senso (!), Proverò a creare un esempio per ciò che penso che ti serva. – adelphus

+0

sarebbe fantastico come se avessi problemi di dimensionamento in questo modo funziona ma come dici tu sapevo che c'era un modo migliore –

Problemi correlati