5

Ich habe die WebView und ich möchte, während Seite in der WebView geladen wird, in ActionBar Show Fortschritt. Die Anwendung verwendet die AppCompat Android-Bibliothek und die Zielversion der App und die Kompilier-SDK-Version ist 21. Nur das WebView wird normal ausgeführt.ActionBar zeigt nicht den Fortschrittsbalken

Ich denke, Problem in der Methode setSupportProgress(int progress).

Mein Code ist der folgende.

Aktivität:

public class AuthActivity extends ActionBarActivity { 

private boolean isConfirmationRequired = false; 
private Utils utils = new Utils(); 

@SuppressLint("SetJavaScriptEnabled") 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    supportRequestWindowFeature(Window.FEATURE_PROGRESS); 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_auth); 

    final String authUrl = "some url"; 
    final WebView authWebView = (WebView) findViewById(R.id.auth_web_view); 
    authWebView.getSettings().setJavaScriptEnabled(true); 
    authWebView.setWebChromeClient(new WebChromeClient() { 
     @Override 
     public void onProgressChanged(WebView view, int newProgress) { 
      setTitle(R.string.loading); 
      setSupportProgress(newProgress * 100); 

      if (newProgress == 100) 
       setTitle(R.string.sign_in); 
     } 
    }); 

    authWebView.setWebViewClient(new WebViewClient() { 
     @Override 
     public void onPageStarted(WebView view, String url, Bitmap favicon) { 
      super.onPageStarted(view, url, favicon); 
      if (!url.equals(authUrl)) 
       isConfirmationRequired = true; 
     } 

     @Override 
     public boolean shouldOverrideUrlLoading(WebView webView, String url) { 
      boolean hasUserBrokenAuth = url.equals("some url") || 
        url.equals("some url"); 
      boolean isUserAuthorized = url.startsWith("some url" + 
        "access_token="); 

      if (hasUserBrokenAuth) { 
       if (isConfirmationRequired) 
        utils.showConfirmDialog(AuthActivity.this); 
       else 
        finish(); 
      } else { 
       utils.webViewLoadUrlIfInternetIsConnected(AuthActivity.this, authWebView, url); 
       if (isUserAuthorized) 
        saveAuthData(url); 
      } 
      return true; 
     } 
    }); 

    utils.webViewLoadUrlIfInternetIsConnected(this, authWebView, authUrl); 
} 

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_BACK) { 
     if (isConfirmationRequired) { 
      utils.showConfirmDialog(this); 
     } 
    } 
    return super.onKeyDown(keyCode, event); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    if (isConfirmationRequired) { 
     utils.showConfirmDialog(this); 
     return true; 
    } else { 
     return super.onOptionsItemSelected(item); 
    } 

} 

private void saveAuthData(String url) { 
    String accessToken = utils.extractPattern(url, "access_token=(.*?)&"); 
    String userId = utils.extractPattern(url, "user_id=(\\d*)"); 
} 

utils.webViewLoadUrlIfInternetIsConnected:

public void webViewLoadUrlIfInternetIsConnected(final Context context, final WebView webView, 
               final String url) { 
    if (isInternetConnected(context)) { 
     webView.loadUrl(url); 
    } else { 
     showSnackbarInternetDisconnected(context, new ActionClickListener() { 
      @Override 
      public void onActionClicked(Snackbar snackbar) { 
       snackbar.dismiss(); 
       webViewLoadUrlIfInternetIsConnected(context, webView, url); 
      } 
     }); 
    } 
} 

Antwort

3

AppCompat nicht unterstützt eine Fortschrittsanzeige zeigt, wie es möglich war, so können Sie folgende aus dem Code entfernen:

supportRequestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 
setSupportProgressBarIndeterminateVisibility(...); 

Es besteht die Möglichkeit, anstatt die neue Symbolleiste zu verwenden, ich habe es heute selbst ausprobiert, aber es kompliziert alles.Die Lösung, die ich mit beendet war mehr um einen Menüpunkt festgelegt, dass ein Layout verweist, die eine drawbale verweist:

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:app="http://schemas.android.com/apk/res-auto" > 

<item 
    android:id="@+id/menu_progress" 
    android:visible="false" 
    app:showAsAction="always" 
    app:actionLayout="@layout/progress_indeterminate" 
    tools:ignore="AlwaysShowAction,UnusedAttribute"/> 

Dann wird das Layout wie folgt aussieht:

<?xml version="1.0" encoding="utf-8"?> 
<ProgressBar xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/toolbar_progress_bar" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:indeterminateDrawable="@drawable/custom_progress_wheel" /> 

Und die ziehbar wie folgt (die Sie anpassen können diese, wie Sie wollen):

<?xml version="1.0" encoding="utf-8"?> 
<rotate xmlns:android="http://schemas.android.com/apk/res/android" 
    android:fromDegrees="0" 
    android:pivotX="50%" 
    android:pivotY="50%" 
    android:toDegrees="720" > 

<shape 
    android:innerRadiusRatio="3" 
    android:shape="ring" 
    android:thicknessRatio="12" 
    android:useLevel="false" > 

    <gradient 
     android:centerColor="#FFFFFF" 
     android:centerY="0.50" 
     android:endColor="#FFFFFF" 
     android:startColor="#000000" 
     android:type="sweep" 
     android:useLevel="false" /> 
</shape> 
</rotate> 

Dann in onCreateOptionsMenu initialisieren Sie die menuItem mit folgenden:

mProgressMenu = menu.findItem(R.id.menu_progress); 

und mit setVisibility können Sie die Sichtbarkeit des Menüs überall in Ihrer Aktivität ändern.

+1

Eine großartige Lösung, danke. Nur anstelle des benutzerdefinierten Zeichensatzes fügte ich dem ProgressBar-Layout style = "? Android: attr/android: progressBarStyleSmall" hinzu. – Yar

+0

Ich weiß, aber ich habe explizit das benutzerdefinierte Zeichen verwendet, um das gleiche auf jeder Android-Version zu haben. – David

0

Sie sollten versuchen, die Visibility von ProgressBar mit setSupportProgressBarVisibility(boolean) wie folgt zu aktualisieren:

// set Visibility to TRUE 
setSupportProgressBarVisibility(true); 

Und dann, in onProgressChanged , d Isable seine Visibility, wenn der Fortschritt endet:

@Override 
public void onProgressChanged(WebView view, int newProgress) { 
    setTitle(R.string.loading); 
    setSupportProgress(newProgress * 100); 

    if (newProgress == 100) { 
     // set it to FALSE 
     setSupportProgressBarVisibility(false); 
     setTitle(R.string.sign_in); 
    } 
    //... 
} 

Update:

Eine andere Lösung könnte sein, eine Gewohnheit zu verwenden Progress View zum AppCompat hinzugefügt.

Sie zu haben aufblasen die benutzerdefinierte Ansicht, die eine horizontale ProgressBar enthält, erhalten die ActionBar Behälter Viewgroup und die Ansicht benutzerdefinierte Add zum Container:

/** Inflate a custom view **/ 
View ab_progressView = getLayoutInflater().inflate(R.layout.ab_progressbar, null) 
/** Get the ActionBar container **/ 
ViewGroup ab_container = (ViewGroup) findViewById(R.id.action_bar_container); 
/** Add the custom view **/ 
ab_container.addView(ab_progressView); 

Wenn ab_container gibt NullPointerException zurück, Sie müssen nur ein neues Runnable erstellen, um seine ID in einem parallelen Thread zu erhalten.

Sie haben an der Unterseite des ActionBar diese neue Ansicht zu setzen:

/** Create layout parameters **/ 
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
    LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); 
/** Set the gravity **/ 
params.gravity = Gravity.BOTTOM; 
/** Set these params to your view **/ 
ab_progressView.setLayoutParams(params); 

dann den Fortschritt aktualisieren:

/** Get the progress bar **/ 
final ProgressBar progressBar = (ProgressBar) ab_progressView.findViewById(R.id.progress); 

@Override 
public void onProgressChanged(WebView view, int newProgress) { 
    /** Update the progress **/ 
    progressBar.setProgress(newProgress * 100); 
} 

Wenn der Fortschritt endet, entfernen Sie einfach die benutzerdefinierte Ansicht:

/** Remove the custom view added **/ 
ab_container.removeView(ab_progressView); 

Ich habe diese Lösung nicht getestet, aber ich t sollte funktionieren ..

+0

Leider hat es mir nicht geholfen. Gibt es andere Lösungen? –