0


我知道有很多类似的问题,并相信我,我尝试了很多,但没有为我解决。我有一个使用Webview的Android应用程序。您可以在Play商店中找到我的应用程序:https://play.google.com/store/apps/details?id=at.rk.rps&feature=search_result#?t=W251bGwsMSwxLDEsImF0LnJrLnJwcyJd

在Play商店几个月后,我决定更新并为我的新设计使用Android设计指南,因此必须使用操作栏。我用ActionbarSherlock去了,一切都很好,除了Webview现在每次旋转手机时都重新加载。在我的最后一个版本中,我用这个答案处理了这个问题,它的工作原理如下:
My Webview Reloads When I Change From Portrait To Landscape

但现在它不会再工作。我已经尝试过这样的解决方案:(我也在网站的最后留下了评论)
http://www.devahead.com/blog/2012/01/preserving-the-state-of-an-android-webview-on-screen-orientation-change/

同样令人失望的结果。我甚至不确定ActionbarSherlock是否是问题,因为我已经改变了很多,但不可能重新创建旧状态!所以我希望你们中的一位能够帮助我,我现在正在处理这个问题一个月,我真的很感谢你们的帮助!

这是应用的样子(这是只有在实施了新的版本,你不能在这Play商店发布的版本找到它):
WebView与SherlockActionBar轮流重新加载

loading screen PayPal site

下面是我的代码的一部分,第一清单,然后布局和后来的Java代码:

清单:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="at.rk.rps" 
    android:versionCode="8" 
    android:versionName="0.4" > 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="15" /> 

    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.CALL_PHONE" /> 

    <application 
     android:icon="@drawable/rps" 
     android:label="@string/app_name" 
     android:theme="@style/Theme.Sherlock.Light.DarkActionBar" > 
     <activity 
      android:name=".RPSActivity" 
      android:configChanges="orientation" 
      android:label="@string/app_name" > 
     </activity> 
     <activity 
      android:name=".SettingsActivity" 
      android:label="@string/app_name" 
      android:windowSoftInputMode="stateHidden" > 
     </activity> 
     <activity 
      android:name=".DonateActivity" 
      android:label="@string/app_name" > 
     </activity> 
     <activity 
      android:name=".PayPalActivity" 
      android:configChanges="orientation" 
      android:label="@string/app_name" > 
     </activity> 
     <activity 
      android:name=".LoadingScreen" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

布局:

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

    <TextView 
     android:id="@+id/paypal_loadingtext" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="90dp" 
     android:gravity="center" 
     android:text="@string/paypal_loadingtext" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:textColor="@color/rk_red" /> 

    <ProgressBar 
     android:id="@+id/paypal_progressbar" 
     style="?android:attr/progressBarStyleHorizontal" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_below="@+id/paypal_loadingtext" 
     android:layout_marginLeft="40dp" 
     android:layout_marginRight="40dp" 
     android:layout_marginTop="10dp" /> 

     <WebView 
     android:id="@+id/paypal_webview" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:visibility="gone" /> 

</RelativeLayout> 

Java代码:

package at.rk.rps; 

import org.apache.http.util.EncodingUtils; 

import android.content.res.Configuration; 
import android.os.Bundle; 
import android.view.KeyEvent; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.WindowManager; 
import android.webkit.WebChromeClient; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 
import android.widget.LinearLayout; 
import android.widget.ProgressBar; 
import android.widget.TextView; 

import com.actionbarsherlock.app.ActionBar; 
import com.actionbarsherlock.app.SherlockActivity; 
import com.actionbarsherlock.view.Menu; 
import com.actionbarsherlock.view.MenuInflater; 
import com.actionbarsherlock.view.MenuItem; 

public class PayPalActivity extends SherlockActivity { 

private ActionBar actionbar; 
    private WebView webview; 
    private TextView loadingtxt; 
    private ProgressBar progressbar; 

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

     if(getSharedPreferences(RPSActivity.PREFS_NAME, 0).getBoolean(RPSActivity.FULLSCREEN, true)) this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 

     setContentView(R.layout.paypal); 

     initUI(); 
    } 

    private void initUI() { 

     actionbar = getSupportActionBar(); 
     actionbar.setTitle(R.string.paypal_actionbar_headline); 
     actionbar.setHomeButtonEnabled(true); 
     this.actionbar.setDisplayHomeAsUpEnabled(true); 

     loadingtxt = (TextView) findViewById(R.id.paypal_loadingtext); 
     progressbar = (ProgressBar) findViewById(R.id.paypal_progressbar); 

     webview = (WebView) findViewById(R.id.paypal_webview); 

     webview.requestFocus(View.FOCUS_DOWN); // Enables the keyboard in landscape mode 
     webview.setOnTouchListener(new View.OnTouchListener() {    
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 

       switch (event.getAction()) { 
       case MotionEvent.ACTION_DOWN: 
       case MotionEvent.ACTION_UP: 
        if (!v.hasFocus()) { 
         v.requestFocus(); 
        } 
        break; 
       } 

       return false; 
      } 
     }); 

     webview.getSettings().setJavaScriptEnabled(true); // Enables JavaScript 
     webview.getSettings().setBuiltInZoomControls(true); // Enables zoom 

     webview.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); // Displays scrollbars outside the view 
     webview.setScrollbarFadingEnabled(false);  

     webview.getSettings().setLoadWithOverviewMode(true); 
     webview.getSettings().setUseWideViewPort(true); 

     webview.setWebChromeClient(new WebChromeClient() { 
      public void onProgressChanged(WebView view, int progress) { 

       loadingtxt.setVisibility(TextView.VISIBLE); 
       progressbar.setVisibility(ProgressBar.VISIBLE); 
       webview.setVisibility(WebView.GONE); 

       progressbar.setProgress(progress); 
       if(progress == 100) { 
        loadingtxt.setVisibility(LinearLayout.GONE); 
        progressbar.setVisibility(LinearLayout.GONE); 
        webview.setVisibility(WebView.VISIBLE); 
       } 
      } 
     }); 

     webview.setWebViewClient(new WebViewClient()); 

     byte[] post = EncodingUtils.getBytes("cmd=_s-xclick&hosted_button_id=VRM63MEY4J936", "BASE64"); 
     webview.postUrl("https://www.paypal.com/cgi-bin/webscr", post);   

    } 


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


    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     if(event.getAction() == KeyEvent.ACTION_DOWN){ 
      switch(keyCode) 
      { 
      case KeyEvent.KEYCODE_BACK: 
       if(webview.canGoBack() == true){ 
        webview.goBack(); 
       } else { 
        finish(); 
       } 
       return true; 
      } 
     } 
     return super.onKeyDown(keyCode, event); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater i = getSupportMenuInflater(); 
     i.inflate(R.menu.paypal_menu, menu); 
     return super.onCreateOptionsMenu(menu); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle item selection 
     switch (item.getItemId()) { 
     case android.R.id.home: 
      finish(); 
      return(true); 

     case R.id.paypal_actionbar_reload: 
      webview.reload(); 
      return(true); 
     default: 
      return super.onOptionsItemSelected(item); 
     } 
    } 
} 

感谢, 保罗

+0

您目前使用哪种ABS版本?看起来在清单中使用configChanges也可能导致其他问题:https://github.com/JakeWharton/ActionBarSherlock/issues/279#issuecomment-4934511 – mattdonders 2012-07-23 19:55:16

+0

嗨,感谢您的帮助!我使用的是ABS 4.1.0,我认为这是最新版本,你有什么建议吗? – Spipau 2012-07-24 19:54:26

回答

2

我在这里找到了答案:

https://stackoverflow.com/a/9550231/1254514 “从Android 3.2(API等级13)开始,‘屏幕尺寸’也改变时,纵向和横向之间的设备切换。“

所以我不得不做以下几点:

添加在您的Android清单的活动你喜欢:

android:configChanges="keyboardHidden|orientation|screenSize" 

然后重写功能,在您的活动:

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

花了我一个月的时间才发现, 希望我可以帮助你们。你的, 保罗

0

也许如果您尝试这样的事:

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

    if(getSharedPreferences(RPSActivity.PREFS_NAME, 0).getBoolean(RPSActivity.FULLSCREEN, true)) this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 

    setContentView(R.layout.paypal); 

    initUI(); 

    if(savedInstanceState != null) 
    { 
     /** Restoring the web Ui state. */ 
     webView.restoreState(savedInstanceState); 
    } 

} 

@Override 
public void onSaveInstanceState(Bundle outState) 
{ 
    /** Saving the webview state. */ 
    webView.saveState(outState); 
} 

这是未经测试,但它似乎就像你没有保存webview的状态一样。我在片段中使用这段代码,它似乎保存了webview的状态。

+0

感谢您的回答,但它不起作用。你有什么其他的建议? – Spipau 2012-10-04 14:46:17