سؤال

لدي عرض ويب لتجاوز المتصفح المدمج وأريد إظهار مؤشر تقدم على شريط العنوان.

هذا هو الرمز:

    @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" في بيان التطبيق ، هل سيظهر شريط التقدم بعد الآن أم لا؟

شكرًا لك.

هل كانت مفيدة؟

المحلول

في الواقع ، الكود الصحيح هو (اختباره وعمله):

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 التخطيط ، مثل:

<?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 ، إليك بعض رمز الإنتاج الذي تم اختباره بالكامل. شكرا جزيلا لك ، درالانجوس! أخيرًا ، الدوار الذي لا يختفي عند دوران الجهاز.

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

هذه هي شريط التقدم على غرار الدوار في actionbar

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

لا تحتاج إلى طلب كل من ميزات النافذة ، فقط تلك الخاصة بنوع التقدم الذي تحتاجه.

الخطأ في رمز البروت setProgressBarIndeterminateVisibility(true) بعد عدم طلب 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>

ال FrameLayout يسمح شريط التقدم بالتعويم فوق WebView. ضبط 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 في مؤشر ترابط أصلي ، لذا يتم استدعاء setProgressBarIndEterMinatevibility (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();
    } 
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top