Man*_*anu 34 android titlebar progress-bar
我有一个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();
}
}
Run Code Online (Sandbox Code Playgroud)
我认为,根据我在网上看到的Android文档和其他示例,它应该可以工作.但它没有,你能告诉我我错在哪里吗?
还有一个问题:如果有时候我会选择android:theme="@android:style/Theme.NoTitleBar"在应用程序清单中声明,进度条是否会显示?
谢谢.
Man*_*anu 47
事实上,正确的代码是(测试和工作):
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();
}
}
Run Code Online (Sandbox Code Playgroud)
小智 16
我也遇到了同样的问题.
因为我设置了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>
Run Code Online (Sandbox Code Playgroud)
在代码中:
//加载网址时
progressBar.setProgress(0);
progressBar.setVisible(View.VISIBLE);
Run Code Online (Sandbox Code Playgroud)
...
// loading ...进度已更改
progressBar.setProgress(progress);
Run Code Online (Sandbox Code Playgroud)
...
//页面完成时
progressBar.setVisible(View.GONE);
Run Code Online (Sandbox Code Playgroud)
完成!
小智 10
我已经解决了这个问题.
您的电话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
}
Run Code Online (Sandbox Code Playgroud)
看到一些答案如何混淆两个进度条,决定添加另一个答案
这些是针对顶部的水平进度条
requestWindowFeature(Window.FEATURE_PROGRESS);
setProgressBarIndeterminate(true);
setProgress(intVal);
setProgressBarVisibility(true);
Run Code Online (Sandbox Code Playgroud)
这些是针对动作栏中的微调器式进度条
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setProgressBarIndeterminateVisibility(true);
Run Code Online (Sandbox Code Playgroud)
您不需要同时请求两个窗口功能,只需要您需要的进度类型.
OP代码中的错误是setProgressBarIndeterminateVisibility(true)没有请求的caling Window.FEATURE_INDETERMINATE_PROGRESS(反之亦然:调用setProgressBarIndeterminateVisibility()而不是setProgressBarVisibility())
似乎Android 5.0(API 21)及以上版本Windows.FEATURE_PROGRESS不再适用.从一致性的反应中得到一些提示,我能够构建一个类似于其他浏览器的进度条.
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>
Run Code Online (Sandbox Code Playgroud)
的FrameLayout允许浮在网页视图上方的进度条.设置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/");
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
35636 次 |
| 最近记录: |