2016-05-10 6 views
5

自分のウェブサイトからのニュースフィードとして機能する小さなレイアウトのwebViewを持っています。回転を変更するたびにWebページが読み込まれます。webviewfragmentを使用して向きを変更すると、私のwebviewの状態を保存する方法

私はコードを編集し、状態を復元するために編集しました。devのサイトからオリエンテーションと画面サイズを含むように設定変更を含むようにAndroidのマニフェストを調整しました。

これは状態を保存するという問題を解決しますが、新しいデバイスのランドスケープモードではサイズのレイアウトが異なります。マニフェストセットではどのように画面サイズをオーバーライドしますか?状態を保存するために離れているが、私のマニフェストで画面サイズを使用していない。だから私は私のランドスケープレイアウトを使用することができます

ここでは、向きの変更のための私のコードです。

@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); 

はその後、私のマニフェストファイルは

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

IVEは、コンテナANウェブビューのフラグメントを追加しましたが、回転が風景であるとき、今表示が消えます。それから私はスイッチバックすると完全に消えます。だから私は保存状態を追加し、風景に回転したときにwebviewをロードしたが、肖像画に戻るときにアプリをクラッシュした

+0

あなたは 'アンドロイドを追加しようとしました:configChanges = "オリエンテーション|画面サイズ" あなた' 'タグ(マニフェスト)での'? –

+0

ええ、それを試して、それは状態を保存するが、それは私のスクリーンサイズをオーバーライドし、これは私が問題を引き起こす| screensizeオプションを元の状態を保存しないように戻すことに戻って –

+2

あなたはフラグメント内に配置しようとすることができます - 画面が回転しているときには残酷にアクティビティとして表示されます。あなたは、断片化の中のwebviewがそのままの回転で生き残ることができるかもしれません。 – adelphus

答えて

2

WebViewをアクティビティレイアウトの一部として配置するサンプルコードです。ポートレートモードでは、ビューは中央に配置され、ランドスケープでは下に配置されます。どちらの向きも同じ単一の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 /レイアウト/ main.xml(デフォルト/ポートレートモード)

<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 /レイアウトランド/メイン。XML(ランドスケープ)

<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 /レイアウト/ 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

@デルファスはこのようなことを今すぐ試してみます –

+0

@:adelphus画面を回転させると、ビューは完全に消えます。もう一度試してみることがあります –

+0

iveもsave out状態を追加してwebviewFragmentに保存しようとしました。両方のビューにWebビューが表示されます。 dosentは状態を保存し、ポートレートに戻るときにアプリをクラッシュさせる –

0

私はあなたが単にアンドロイドを追加することによって簡単に解決できると思う:configChangesこのようなのAndroidManifest.xmlであなたの活動:

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

申し訳ありませんが含まれている投稿を編集する –

0

OKみんなそうIVEは、WebViewのための断片を使用してそれをsussed。私はwebivewと呼ばれるものとwebviewfragmentlandscapeというものの2つの断片を作りました。

その後、私は両方のフラグメントをロードしましたが、私がすでに使っていた設定変更方法を使ってデバイスがランドスケープになるまで、ランドスケープを見えなくしました。ここに私の新しいコードはこの上に

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

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

を作成されたすべてのボディは、それが大きな助け

であるものIVE DOENに向上させることができれば、これは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); 


     } 

前であり、これは肖像画の断片です

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

最後にランドスケープの断片

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

あなたは何をしたしかし、それは不要なはずの同じもののために2つのフラグメントがロードされているので理想的ではありません。通常は、それぞれのカスタムレイアウトサイズを持つアクティビティ用の2つのレイアウト(通常のものと1つのランドスケープ)を作成し、 'onCreate()'中に*単一の*フラグメント(webview)を展開します。画面が回転すると、Androidはアクティビティの代替レイアウトを読み込みますが、何もせずにフラグメントを新しいレイアウトコンテナ(2つのレイアウトのIDが一致する必要があります)に自動的に転送します。 – adelphus

+0

それが意味をなさない(!)なら、私はあなたが必要と思うものの例を試してみよう。 – adelphus

+0

これはサイジングの問題を抱えているように私には素晴らしかったですが、これはうまくいきますが、あなたにはもっと良い方法があると分かっていました –

関連する問題