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文档和其他样本,我认为它应该工作。 但它不,你能告诉我我错在哪里吗?

还有一个问题:如果有时候以后我会select在应用程序清单中声明android:theme="@android:style/Theme.NoTitleBar" ,进度条会不会显示?

谢谢。

事实上,正确的代码是(testing和工作):

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

C'est完成!

我已经解决了这个问题。

您对setProgressBarVisibility()调用必须位于onStart()onResume()因为在此之前,您不能保证有任何视图可以更改可见性。


Dralangus的这个令人难以置信的解决scheme,这里有一些完全testing的生产代码。 非常感谢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 } 

看到一些答案混淆了两个进度条,决定添加另一个答案

这些是顶部的水平进度条

 requestWindowFeature(Window.FEATURE_PROGRESS); setProgressBarIndeterminate(true); setProgress(intVal); setProgressBarVisibility(true); 

这些是在操作栏中的微调风格的进度条

 requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); setProgressBarIndeterminateVisibility(true); 

您不需要同时请求两个窗口function,只需要您需要的进度types即可。

在OP代码中的错误是setProgressBarIndeterminateVisibility(true)没有请求Window.FEATURE_INDETERMINATE_PROGRESS (反之亦然:调用setProgressBarIndeterminateVisibility()而不是setProgressBarVisibility()

看来,Android 5.0(API 21)和以上的Windows.FEATURE_PROGRESS不再有效。 从univasity的回应中得到一些提示,我能够build立一个类似于其他浏览器的进度条。

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允许进度条在webview上浮动。 将android:max设置为100会使其与活动中的默认范围alignment,因此不必将其值转换为进度栏所使用的默认值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(); } }