5

Mam WebView i chcę, aby strona ładowała się w WebView, w postępie w programie ActionBar. Aplikacja korzysta z biblioteki AppCompat Android, docelowa aplikacja i skompilowana wersja SDK to 21. Tylko WebView działa normalnie.ActionBar nie wyświetla paska postępu

Myślę, że problem w metodzie setSupportProgress(int progress).

Mój kod jest poniżej.

aktywny:

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

Odpowiedz

3

AppCompat nie obsługuje pokazującą widok postępu, jak to było możliwe, więc można usunąć z kodu następujący:

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

istnieje możliwość, aby zamiast korzystać z nowego paska narzędzi, I wypróbowałem to sam dzisiaj, ale to wszystko komplikuje.Rozwiązanie skończyło się było ustawić pozycję menu bardziej, że odwołuje się układ, który odwołuje się do drawbale:

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

Następnie układ wygląda następująco:

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

a rozciągliwej jako obserwacji (można dostosować to jak chcesz):

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

Następnie w onCreateOptionsMenu zainicjować mENUITEM z następujących powodów:

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

oraz z setVisibility można śledzić widoczność menu w dowolnym miejscu aktywności.

+1

Świetne rozwiązanie, dzięki. Zamiast niestandardowego losowania dodałem style = "? Android: attr/android: progressBarStyleSmall" do układu ProgressBar. – Yar

+0

Wiem, ale wyraźnie użyłem niestandardowego losowania, aby mieć ten sam na każdej wersji Androida. – David

0

Należy starać się aktualizować Visibility z ProgressBar z setSupportProgressBarVisibility(boolean) następująco:

// set Visibility to TRUE 
setSupportProgressBarVisibility(true); 

A potem, w onProgressChanged , d Isable jego Visibility gdy postęp kończy:

@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); 
    } 
    //... 
} 

Aktualizacja:

Innym rozwiązaniem może być użycie niestandardowych Progress View dodany do AppCompat.

Trzeba nadmuchać widok niestandardowy, który zawiera poziomą ProgressBar, dostać ActionBar pojemnik ViewGroup i dodać niestandardowy widok z pojemnikiem:

/** 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); 

Jeśli ab_container zwraca NullPointerException, wystarczy utworzyć nowy Runnable, aby jego identyfikator znalazł się w równoległym wątku.

Musisz ustawić ten nowy pogląd na dole ActionBar:

/** 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); 

Następnie zaktualizować toku:

/** 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); 
} 

Kiedy postęp kończy, po prostu usuń widoku niestandardowego:

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

Nie przetestowałem tego rozwiązania, ale t powinno działać ..

+0

Niestety, to mi nie pomogło. Czy są jakieś inne rozwiązania? –