組み込みブラウザーをオーバーライドする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"
アプリケーションマニフェストで、進行状況バーが表示されるかどうかを示しますか?
ありがとうございました。
実際、正しいコードは(テスト済みで機能しています):
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();
}
}
私も同じ問題を抱えていました。
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);
終わりです!
私は問題を解決しました。
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
}
一部の回答が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()
を呼び出す)。
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/");
}
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();
}
}