Подтвердить что ты не робот

Android: индикатор выполнения в заголовке окна не отображается

У меня есть веб-представление, чтобы переопределить встроенный браузер, и я хочу показать индикатор прогресса в строке заголовка.

Это код:

    @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 и другими образцами, которые я видел в сети. Но это не так, не могли бы вы рассказать мне, где я ошибаюсь?

И еще один вопрос: если позже я выберу объявить android:theme="@android:style/Theme.NoTitleBar" в манифесте приложения, появится ли индикатор выполнения или нет?

Спасибо.

4b9b3361

Ответ 1

Фактически правильный код (протестирован и работает):

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

Ответ 2

У меня тоже проблема.

Потому что я устанавливаю андроид: theme = "@android: style/Theme.NoTitleBar"

Я решаю его, добавив ProgressBar в XML файл макета, например:

<?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 закончить!

Ответ 3

Я решил проблему.

Ваш вызов 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
    }

Ответ 4

Увидев, как некоторые ответы смешивают два индикатора выполнения, решили добавить еще один ответ

Это для горизонтального индикатора выполнения в верхней части

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

они предназначены для строки выполнения в стиле барьера в панели действий

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

Вам не нужно запрашивать обе функции окна, только тот, который вам нужен.

Ошибка в OP-коде выполняется setProgressBarIndeterminateVisibility(true), не запрашивая Window.FEATURE_INDETERMINATE_PROGRESS (или наоборот: вызов setProgressBarIndeterminateVisibility() вместо setProgressBarVisibility())

Ответ 5

Похоже, что с 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>

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

Ответ 6

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