5

WebView가 있고 ActionBar 진행률에서 WebView에서로드하고 싶은 페이지를로드하려고합니다. 응용 프로그램은 AppCompat 안드로이드 라이브러리를 사용하고 있으며 응용 프로그램의 타겟 및 컴파일 SDK 버전은 21입니다. WebView 만 정상적으로 실행됩니다.ActionBar에 진행률 막대가 표시되지 않습니다.

setSupportProgress(int progress) 방법에 문제가 있다고 생각합니다.

내 코드는 다음과 같습니다.

활동 :

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

답변

3

APPCOMPAT 그것이 가능했다으로 진행보기를 보여주는 지원하지 않습니다 .. 작동합니다, 그래서 당신은 당신의 코드에서 다음 제거 할 수 있습니다

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

대신 새 도구 모음을 사용할 수있는 가능성이 내가있다 오늘 나 혼자 시도했지만, 모든 것을 복잡하게 만든다.

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

그런 다음 레이아웃은 다음과 같습니다 : 나는 끝났다 솔루션은 drawbale 참조하는 레이아웃 참조하는 많은 메뉴 항목을 설정하는 것이 었습니다

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

그리고 다음과 같은 드로어 블을 (당신은 사용자 정의 할 수 있습니다 당신이 원하는대로이) :

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

는 다음의 onCreateOptionsMenu에서 당신은 다음과 같이 메뉴 아이템 MenuItem을 초기화 :

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

및 setVisibility를 사용하면 활동의 어느 곳에서나 메뉴의 가시성을 조정할 수 있습니다.

+1

좋은 해결책, 고마워. 사용자 정의 drawable 대신에 스타일 = "? android : attr/android : progressBarStyleSmall"을 ProgressBar 레이아웃에 추가했습니다. – Yar

+0

나도 알아,하지만 나는 분명히 사용자 정의 드로어 블을 사용하여 각각의 안드로이드 버전에서 동일한 드로어 블을 사용했다. – David

0

다음과 같이 setSupportProgressBarVisibility(boolean)ProgressBarVisibility를 업데이트하려고한다 : 다음

// set Visibility to TRUE 
setSupportProgressBarVisibility(true); 

을 그리고 onProgressChanged에, , d isable의 Visibility 진행이 종료 :

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

업데이트 :

또 다른 해결책은 Progress ViewAppCompat에 추가 사용자 정의를 사용하는 수 있습니다.

/** 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 경우 : 당신은 에있는

수평의 ProgressBar를 포함하는 사용자 정의보기, 액션 바 용기 뷰 그룹과 이 컨테이너에 사용자 정의보기를 추가 취득을 팽창 NullPointerException을 반환하면 병렬 스레드에서 해당 ID를 얻으려면 새 Runnable을 만들어야합니다. 진행이 끝나면,

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

, 그냥 사용자 지정보기를 제거 :

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

그런 다음 진행 상황을 업데이트 :

당신은 액션 바의 하단에 새로운보기를 설정해야합니다 :

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

이 솔루션을 테스트하지 않았지만 t는

+0

불행히도, 그것은 나에게 도움이되지 못했습니다. 다른 해결책이 있습니까? –

관련 문제