Android: لا يتم عرض شريط التقدم في عنوان النافذة
-
29-09-2019 - |
سؤال
لدي عرض ويب لتجاوز المتصفح المدمج وأريد إظهار مؤشر تقدم على شريط العنوان.
هذا هو الرمز:
@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();
}
}