2010-06-22 18 views
34

प्रदर्शित नहीं करती है मेरे पास अंतर्निहित ब्राउज़र को ओवरराइड करने के लिए एक वेब दृश्य है और मैं शीर्षक पट्टी पर एक प्रगति संकेतक दिखाना चाहता हूं।एंड्रॉइड: विंडो के शीर्षक में प्रगति पट्टी

@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:theme="@android:style/Theme.NoTitleBar" घोषित करना चुनता हूं, तो प्रगति बार अब और दिखाएगा?

धन्यवाद।

उत्तर

46

वास्तव में सही कोड (परीक्षण किया है और काम कर रहा) है:

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

धन्यवाद, यह वही है जो मैं ढूंढ रहा था। –

+0

पूरी तरह से काम करता है, धन्यवाद! नोट करें कि अनुरोध WindowFeature (Window.FEATURE_INDETERMINATE_PROGRESS); और setProgressBarIndeterminateVदृश्य (सत्य); एक्शन बार में स्पिनर प्रगति सेट करता है। –

+0

क्या आप बता सकते हैं कि मुख्य अंतर क्या है? – ironic

3

WebView.loadUrl मूल धागे में चलाया जाता है, इसलिए सेट प्रोग्रेसबार इंडिडेटर्मिनेशन (झूठी) तुरंत बहुत अधिक कहलाता है। इसके अलावा यदि आप थीम का उपयोग करते हैं। 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(); 
    } 
} 
+0

बहुत बहुत धन्यवाद! – Manu

+0

मैं एंड्रॉइड विकास के लिए बेहद नया हूं, इसलिए यह एक मूर्ख सवाल हो सकता है। 'ब्राउज़र सक्रियता' का उपयोग करने के लिए मुझे आयात करने की क्या आवश्यकता है? – Nick

+0

@ निक, ब्राउज़र सक्रियता वर्तमान गतिविधि है जहां आप अपना कोड कार्यान्वित कर रहे हैं। यह आपकी गतिविधि का नाम है। – Brigadier

16

मैं भी एक ही समस्या मिला है।

क्योंकि मैं एंड्रॉयड सेट: विषय = "@ एंड्रॉयड: शैली/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> 

कोड में:

// जब लोड यूआरएल

progressBar.setProgress(0); 
progressBar.setVisible(View.VISIBLE); 

...

// लोड हो रहा है ... प्रगति

progressBar.setProgress(progress); 

...

बदल // जब पेज को पूरा

progressBar.setVisible(View.GONE); 

C'est खत्म!

10

मैंने इस मुद्दे को हल किया है।

setProgressBarVisibility() को आपका कॉल होना चाहिए onStart() या onResume() में क्योंकि, उस बिंदु से पहले, यह आप किसी भी दृश्य है जिस पर आप एक दृश्यता बदल सकते हैं करने के लिए गारंटी नहीं दी जाती है।


ड्रैलंगस द्वारा इस अविश्वसनीय समाधान के लिए, यहां कुछ पूर्ण परीक्षण किए गए उत्पादन कोड हैं। बहुत बहुत धन्यवाद, ड्रैलंगस! अंत में, एक स्पिनर जो डिवाइस रोटेशन पर नहीं जाता है।

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 
    } 
+1

प्राप्त करने के लिए 100 से गुणा करते हैं 'लिस्ट एक्टिविटी' के लिए यह समाधान है बहुत धन्यवाद – Chaitanya

+0

साइट पर सबसे आश्चर्यजनक उत्तरों में से एक। बहुत धन्यवाद, Dralangus। रास्ते में बाउंटी! – Fattie

8

देखकर कि कैसे कुछ जवाब दो प्रगति सलाखों अप मिश्रण, एक और उत्तर

इन शीर्ष

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

इन spinner- लिए कर रहे हैं पर क्षैतिज प्रगति बार के लिए कर रहे हैं जोड़ने का निर्णय लिया एक्शनबार में शैली प्रगति पट्टी

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

आपको बी अनुरोध करने की आवश्यकता नहीं है ओथ विंडो फीचर्स, केवल एक प्रगति प्रकार के लिए जो आपको चाहिए।

ओपी के कोड में गलती caling है setProgressBarIndeterminateVisibility(true)Window.FEATURE_INDETERMINATE_PROGRESS अनुरोध नहीं होने (या इसके विपरीत: बुला setProgressBarIndeterminateVisibility()setProgressBarVisibility() के बजाय)

7

ऐसा लगता है कि एंड्रॉयड 5.0 (एपीआई 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-10,000 अन्यथा प्रगति बार द्वारा प्रयोग किया जाता का डिफ़ॉल्ट करने के लिए परिवर्तित किया जा 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/"); 
} 
+1

इसे स्पष्ट रूप से रखने के लिए, मैंने बस इस प्रगति पट्टी के काम को करने के लिए लगभग 6 घंटे बिताए और मैंने यहां 20 और क्यू एंड ए के माध्यम से और हर जगह ब्राउज़ किया है और यह ** ** केवल एक ** है, जो पूर्ण रूप से काम करता है स्क्रीन वेबव्यू मैं इसके लिए तुमसे प्यार करता हूँ। धन्यवाद। –

संबंधित मुद्दे