web-dev-qa-db-ja.com

Android:ウィンドウのタイトルの進行状況バーが表示されない

組み込みブラウザーをオーバーライドするWebビューがあり、タイトルバーに進行状況インジケーターを表示したいと思います。

これはコードです:

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().requestFeature(Window.FEATURE_PROGRESS);

    setContentView(R.layout.browser);
    currentURL = BrowserActivity.this.getIntent().getExtras().getString("currentURL");

    try {
        mWebView = (WebView) findViewById(R.id.webview);
        mWebView.getSettings().setJavaScriptEnabled(true);
        mWebView.setWebViewClient(new browserActivityClient());
        setProgressBarIndeterminateVisibility(true);
        mWebView.loadUrl(currentURL);
        setProgressBarIndeterminateVisibility(false);
    } catch (Exception e) {
        Log.e(getClass().getSimpleName(), "Browser: " + e.getMessage());
        Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
    } 
}

Android docsとネットで見た他のサンプル)によれば、それはうまくいくと思いますが、うまくいかないのですが、どこが間違っているのか教えていただけませんか?

そして別の質問:後で後で宣言することを選択する場合はAndroid:theme="@Android:style/Theme.NoTitleBar"アプリケーションマニフェストで、進行状況バーが表示されるかどうかを示しますか?

ありがとうございました。

34
Manu

実際、正しいコードは(テスト済みで機能しています):

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
    requestWindowFeature(Window.FEATURE_PROGRESS);
    currentURL = BrowserActivity.this.getIntent().getExtras().getString("currentURL");

    setContentView(R.layout.browser);

    setProgressBarIndeterminateVisibility(true);
    setProgressBarVisibility(true);

    try {
        mWebView = (WebView) findViewById(R.id.webview);
        mWebView.getSettings().setJavaScriptEnabled(true);
        mWebView.setWebViewClient(new browserActivityClient());

        mWebView.setWebChromeClient(new WebChromeClient() {
           public void onProgressChanged(WebView view, int progress) {
               setProgress(progress * 100);
              if(progress == 100) {
                 setProgressBarIndeterminateVisibility(false);
                 setProgressBarVisibility(false);
              }
           }
        });
        mWebView.loadUrl(currentURL);
    } catch (Exception e) {
        Log.e(getClass().getSimpleName(), "Browser: " + e.getMessage());
        Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
    } 
}
47
Manu

私も同じ問題を抱えていました。

Android:theme = "@ Android:style/Theme.NoTitleBar"を設定したので

次のように、レイアウトxmlファイルにProgressBarを追加して解決します。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"  
Android:orientation="vertical"  
Android:layout_width="fill_parent"  
Android:layout_height="fill_parent"  
>

<ProgressBar Android:id="@+id/progressbar"
    style="?android:attr/progressBarStyleHorizontal"
    Android:layout_width="fill_parent"
    Android:layout_height="3px"
    Android:max="100"
    Android:visibility="gone"
/>

<WebView   
    Android:id="@+id/webview"  
    Android:layout_width="fill_parent"  
    Android:layout_height="fill_parent"  
/>  

</LinearLayout>

コード内:

// URLを読み込むとき

progressBar.setProgress(0);
progressBar.setVisible(View.VISIBLE);

...

//読み込み中...進行状況が変更されました

progressBar.setProgress(progress);

...

//ページが終了したとき

progressBar.setVisible(View.GONE);

終わりです!

16
univasity

私は問題を解決しました。

setProgressBarVisibility()への呼び出しはonStart()またはonResume()内で行う必要があります。その時点より前は、変更できるビューがあるとは限らないためです可視性。


Dralangusによるこの信じられないほどのソリューションのために、ここにいくつかの完全にテストされた製品コードがあります。どうもありがとう、Dralangus!最後に、デバイスの回転時に消えないスピナー。

public class MainActivity extends Activity
{
private static boolean showSpinner; // needs static

public void spinnerOn()
    {
    showSpinner = true;
    setProgressBarIndeterminateVisibility(true);
    }

public void spinnerOff()
    {
    showSpinner = false;
    setProgressBarIndeterminateVisibility(false);
    }

protected void onResume()
    {
    // solved by Dralangus http://stackoverflow.com/a/7414659/294884
    super.onResume();
    if (showSpinner)
        {
        spinnerOn();
        }
    else
        {
        spinnerOff();
        }
    }

protected void onStart()
    {
    super.onStart();
    // note, onResume is called EVEN LATER than onStart,
    // so your most reliable choice is onResume.
    // eternal thanks to Dralangus for this solution
    }

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

    setContentView(R.layout.activity_main);

    ... // Your code
    }
10
Dralangus

一部の回答が2つの進行状況バーをどのように混同しているかを確認し、別の回答を追加することにしました

これらは上部の水平プログレスバー用です

_requestWindowFeature(Window.FEATURE_PROGRESS);
setProgressBarIndeterminate(true);
setProgress(intVal);
setProgressBarVisibility(true);
_

これらはアクションバーのスピナースタイルのプログレスバー用です

_requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setProgressBarIndeterminateVisibility(true);
_

両方のウィンドウ機能を要求する必要はありません。必要な進行状況タイプの1つだけを要求してください。

OPのコードの誤りは、setProgressBarIndeterminateVisibility(true)が_Window.FEATURE_INDETERMINATE_PROGRESS_を要求していないことを計算することです(またはその逆:setProgressBarIndeterminateVisibility()の代わりにsetProgressBarVisibility()を呼び出す)。

8
Ivan Bartsov

Android 5.0(API 21)以上Windows.FEATURE_PROGRESSは機能しなくなりました。 univasityからの応答からいくつかのヒントを得て、他のブラウザーと同様の進行状況バーを作成することができました。

activity_main.xml」

<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
tools:context=".MainActivity"
Android:id="@+id/relativeLayout">

<WebView
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:id="@+id/webView" />

<ProgressBar
    Android:id="@+id/progressBar"
    style="?android:attr/progressBarStyleHorizontal"
    Android:layout_width="fill_parent"
    Android:layout_height="8dp"
    Android:max="100"
    Android:progressTint="#FF29A8FF"
    Android:progressBackgroundTint="#FFFFFFFF"
    Android:visibility="gone" />
</FrameLayout>

FrameLayoutを使用すると、進行状況バーをWebビューの上に表示できます。設定Android:maxを100に設定すると、アクティビティのデフォルトの範囲に揃えられるため、値をデフォルトの0〜10000に変換する必要はありません。 Android:visibility="gone"はデフォルトでプログレスバーを非表示にします。

MainActivty.Java:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Get the WebView and the ProgressBar from activity_main.xml.
    final WebView mainWebView = (WebView) findViewById(R.id.webView);
    final ProgressBar progressBar = (ProgressBar) findViewById(R.id.progressBar);

    // Enables JavaScript.
    mainWebView.getSettings().setJavaScriptEnabled(true);

    // Updates the progress bar whenever there are changes and hides it again when it completes.
    mainWebView.setWebChromeClient(new WebChromeClient() {
        public void onProgressChanged(WebView view, int progress) {
            if (progress < 100) {
                    progressBar.setVisibility(View.VISIBLE);
                } else {
                    progressBar.setVisibility(View.GONE);
                }
            progressBar.setProgress(progress);
        }
    });

    // Makes the mainWebView handle all URLs internally instead of calling the default browser.
    mainWebView.setWebViewClient(new WebViewClient());

    // Load a sample URL.
    mainWebView.loadUrl("http://developer.Android.com/");
}
7
Soren Stoutner

WebView.loadUrlはネイティブスレッドで実行されるため、setProgressBarIndeterminateVisibility(false)がすぐに呼び出されます。また、Theme.NoTitleBarを使用する場合、タイトルバーは表示されません。進行状況バーはタイトルバーにあるため、表示されません。

このようなものが動作するはずです。

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().requestFeature(Window.FEATURE_PROGRESS);

    setContentView(R.layout.browser);
    currentURL = BrowserActivity.this.getIntent().getExtras().getString("currentURL");

    try {
        mWebView = (WebView) findViewById(R.id.webview);
        mWebView.getSettings().setJavaScriptEnabled(true);
        mWebView.setWebViewClient(new browserActivityClient());
        setProgressBarIndeterminateVisibility(true);
        mWebview.setWebChromeClient(new WebChromeClient() {
           public void onProgressChanged(WebView view, int progress) {
              if(progress == 100) {
                 setProgressBarIndeterminateVisibility(false);
              }
           }
        });
        mWebView.loadUrl(currentURL);
    } catch (Exception e) {
        Log.e(getClass().getSimpleName(), "Browser: " + e.getMessage());
        Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
    } 
}
3
Robby Pond