5

WebView'im var ve WebView'da, ActionBar'ın gösterme ilerlemesinde sayfa yüklenirken olmasını istiyorum. Uygulama AppCompat Android kütüphanesi kullanıyor ve uygulamanın hedef ve derleme SDK sürümü 21'dir. Sadece WebView normal şekilde çalışıyor.ActionBar, ilerleme çubuğunu göstermiyor

setSupportProgress(int progress) yönteminde sorun olduğunu düşünüyorum.

Benim kodum aşağıda.

Etkinlik:

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

cevap

3

AppCompat mümkün olduğu gibi bir ilerleme görünümünü gösteren desteklemez .. çalışmalı, böylece kod aşağıdaki kaldırabilirsiniz:

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

yerine yeni araç çubuğunu kullanma imkanı I vardır bugün kendim denedim, ama her şeyi karmaşıklaştırıyor.

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

Ardından düzen benziyor: Birlikte erdi çözüm drawbale başvuran bir düzen başvuru yaptığından daha bir menü öğesi belirlemekti

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

Ve aşağıdaki gibi çekilebilir (özelleştirebilirsiniz istediğiniz kadar bu):

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

Sonra onCreateOptionsMenu içinde aşağıdaki ile Menuıtem başlatmak:

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

ve setVisibility ile etkinliğin herhangi bir yerinde menünün görünürlüğünü ayarlayabilirsiniz.

+1

Harika bir çözüm, teşekkürler. Sadece özel çekilebilir yerine, ProgressBar düzenine style = "? Android: attr/android: progressBarStyleSmall" ifadesini ekledim. – Yar

+0

Biliyorum, ancak her bir Android sürümünde aynı özelliğe sahip olacak şekilde özel olarak çekilebildiğimi açıkça kullandım. – David

0

aşağıdaki gibi setSupportProgressBarVisibility(boolean) ile ProgressBar ait Visibility güncellemek için çalışmalısınız: o zaman

// set Visibility to TRUE 
setSupportProgressBarVisibility(true); 

Ve onProgressChanged yılında, d Isable onun Visibility ilerleme biter:

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

Güncelleme:

Başka bir çözüm Progress ViewAppCompat eklenen özel bir kullanımı olabilir.

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

ab_container varsa: zorunda

yatay ProgressBar içeren özel görünümü, İşlem Çubuğu konteyner ViewGroup ve kaba özel görünüm eklemek olsun şişirmek Bir NullPointerException döndürür, yalnızca bir paralel iş parçacığında kimliği almak için yeni bir Runnable oluşturmanız gerekir. ilerleme sona erdiğinde,

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

, sadece özel bir görünüm kaldırın:

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

Sonra ilerleme güncelleme:

Sen İşlem Çubuğu altındaki bu yeni görünümünü ayarlamak zorunda:

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

Bu çözümü sınamadım, ama ben t

+0

Maalesef bana yardımcı olmadı. Başka çözümler var mı? –

İlgili konular