某些设备上进度条未显示

6

我有以下的布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res/com.pontai"
    android:id="@+id/linearLayout1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <com.markupartist.android.widget.ActionBar
        android:id="@+id/actionbar"
        style="@style/ActionBar"
        android:layout_marginBottom="3dip"
        app:textStyleActionBar="@style/TextViewStyleHeader"
        app:title="@string/app_name" />

    <com.fb.design.SegmentedButton
        android:id="@+id/main_action_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:btnText1="@string/sb_friends"
        app:btnText2="@string/sb_search"
        app:btnText3="@string/sb_summary"
        app:gradientColorOffEnd="@color/segmented_button_off_end"
        app:gradientColorOffStart="@color/segmented_button_off_start"
        app:gradientColorOnEnd="@color/segmented_button_on_end"
        app:gradientColorOnStart="@color/segmented_button_on_start"
        app:gradientColorSelectedEnd="@color/segmented_button_selected_end"
        app:gradientColorSelectedStart="@color/segmented_button_selected_start"
        app:whichButtonIsSelected="0" />

    <View
        android:layout_width="wrap_content"
        android:layout_height="2dp"
        android:layout_marginBottom="3dip"
        android:background="@drawable/gradient_line" >
    </View>

    <LinearLayout
        android:id="@+id/linearLayout7"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >

        <LinearLayout
            android:id="@+id/linearLayout4"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >

            <Button
                android:id="@+id/buttonAddFriends"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/ic_input_add"
                android:clickable="true"
                android:height="40dp"
                android:width="40dp" />

            <EditText
                android:id="@+id/search_box"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:hint="@string/type_here_to_filter"
                android:inputType="text"
                android:maxLines="1"
                android:padding="10dp" >
            </EditText>
        </LinearLayout>

        <LinearLayout
            android:id="@+id/loadingPanel"
            style="@style/GenericProgressBackground"
            android:layout_height="match_parent" >

            <ProgressBar style="@style/GenericProgressIndicator" />
        </LinearLayout>

        <ListView
            android:id="@android:id/list"
            android:layout_width="fill_parent"
            android:layout_height="0dip"
            android:layout_weight="1" />

        <TextView
            android:id="@id/android:empty"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:paddingLeft="5dp"
            android:text="@string/empty_results" />
    </LinearLayout>
</LinearLayout>

我的Activity有一个AsyncTask,在完成后执行以下操作:

((LinearLayout)findViewById(R.id.loadingPanel)).setVisibility(View.GONE);

所以,我有一个LinearLayout,其中包含我的ProgressBar。当我获得所需的数据时,我将此LinearLayout的可见性设置为GONE。
这在我的Galaxy Nexus上工作良好,但在我的API 8模拟器和使用自定义ROM的Galaxy S2上无法正常工作。
有人见过这种情况吗?
最坏的情况是从XML中删除带有进度条的LinearLayout,并在代码中添加一个ProgressDialog。
问候, 菲利普
更新: 这是我如何定义styles.xml
 <style name="GenericProgressBackground" parent="android:Theme">
        <item name="android:layout_width">fill_parent</item>
        <item name="android:layout_height">fill_parent</item>
        <item name="android:background">#77ffffff</item>
        <item name="android:gravity">center</item>
    </style>

    <style name="GenericProgressIndicator" parent="@android:style/Widget.ProgressBar.Large">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:indeterminate">true</item>
    </style>

更新2:我已经修复了这个问题。

 <ProgressBar
                android:id="@+id/progressBar1"
                style="?android:attr/progressBarStyleLarge"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />

我添加了来自Android属性的样式,这就足够了...我不知道为什么我创建的样式不能起作用...真奇怪。
感谢您的帮助! :)

很高兴听到你找到了解决方案。 - Alexandre B.
你可以通过给我点赞来感谢我;-) - Alexandre B.
6个回答

6

在一些设备上,进度条可能无法显示,因为在“设置”->“开发者选项” ->“过渡动画比例”中处于关闭状态。

将此设置切换为打开(通常为x1),进度条将再次出现。

我猜想应该有一个合理的解释,但我不知道为什么关闭动画会使进度条无法工作。


它运行得不太好,你能否请@Sniper给我一些其他的提示? - Manikandan K
嘿@ManikandanK,你遇到了什么问题?进度条在某些设备上工作但在其他设备上不工作吗?你的进度条根本不工作(在每个设备上都是如此)吗?你能在屏幕上看到进度条吗?如果你看到进度条,它会旋转吗? - Stoycho Andreev
1
对我来说,是关闭了动画持续时间缩放。禁用这些设置以加快应用程序之间的转换并使手机看起来更快是很普遍的做法。 - Kris B
对我来说,也是动画持续时间比例的问题。在将其打开(调整为1x)后,我又可以看到进度条了。 - Hooni

4
使用的结果是什么?
<ProgressBar
        style="@android:style/Widget.DeviceDefault.ProgressBar.Large"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center" />

这个应该放在LinearLayout里面吗? 如果不是,我怎么隐藏进度条? - Felipe Caldas
是的,您可以将此代码放入LinearLayout中:但不要忘记在LinearLayout上添加android:layout_width="match_parent" - Alexandre B.
是的,不幸的是这并不能起作用。 实际上,您所建议的已在我的styles.xml中定义。 - Felipe Caldas
在UPDATE2部分找到它。 - Felipe Caldas
它已经可以工作了,Alexandre。 我已经在上面发布了解决方案。谢谢 :) - Felipe Caldas
这对我有用。在我的情况下,我使用了style="?android:attr/progressBarStyleLarge",进度条在旧设备上可见,但在新设备上不可见。将样式更改为style="@android:style/Widget.DeviceDefault.ProgressBar.Large"使其正常工作。谢谢。 - Saik

2

当动画关闭时,某些设备可能会出现此问题。重新打开动画,您的问题应该就解决了。


1

我也遇到了同样的问题。我想在xml布局文件中的启动屏幕上添加一个进度条,我能够在Eclipse预览屏幕时看到进度条显示,但是当我运行代码时,它是不可见的,这让我疯狂了几个小时。最后,我通过在FrameLayout中添加进度条,并在较低层子RelativeLayout中绘制启动背景图像来解决了这个问题。我的背景图像是9patch图像,所以可能在运行时覆盖了我的进度条。但是这是我的解决方案:

<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"
    android:layout_gravity="center" >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/splash" />

    <ProgressBar
        android:id="@+id/progressBar1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical|center_horizontal"
        android:layout_marginTop="150dp"
        android:visibility="visible" />

</FrameLayout>

希望它有所帮助!

我找到了一个更好的解决方案。如果你不在9patch上标记“填充区域”,你就不能添加任何内容,或者你添加的内容会变得不可见。为了解决这个问题,明智地标记你的9patch图像的“填充区域”,并将你的FrameLayout的背景设置为这个9patch图像。然后你就可以在你标记的区域中看到FrameLayout的子元素了。有关9patch图像的更多信息,请参见链接 - Merve Gencer

0

我在HTC U11上遇到了奇怪的问题,我们的电池节省模式自动开启,我关闭了它,但是Spinner仍然没有显示出来。

然后我彻底关闭了开发人员设置,重新启动应用程序,然后Spinner开始显示出来,希望能对某人有所帮助。


0

我的解决方案是从相对布局切换到线性布局。效果很好。以下是代码,希望能帮到你:

activity_main.xml:

 <LinearLayout
        android:id="@+id/leniar"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="0.5"
        android:background="@color/colorPrimary"
        android:baselineAligned="false"
        android:gravity="center"
        android:orientation="horizontal"
        android:weightSum="3">


        <ProgressBar
            android:id="@+id/progressBarlite"
            style="@style/Widget.AppCompat.ProgressBar"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"


            android:gravity="center"
            android:theme="@style/ProgressBarlit" />

        <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
            android:id="@+id/swipeContainer"
            android:layout_width="match_parent"
            android:layout_height="match_parent"

            android:layout_marginTop="0dp"
            android:layout_marginBottom="-1dp"
            android:background="@color/colorPrimaryDark"
            android:visibility="visible">

            <WebView
                android:id="@+id/webview"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_alignParentStart="true"
                android:layout_alignParentLeft="true"
                android:layout_alignParentTop="true">

            </WebView>
        </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
</LinearLayout>

是的,我有一个 WebView 和 SwipeRefreshLayout,但我猜你只需要复制这段代码并删除那些部分。如果你想知道我如何让进度条显示在屏幕中央:

MainActivity.java:

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

                    setTheme(R.style.AppTheme);
                    setContentView(R.layout.activity_main);


     this.progressBar = findViewById(R.id.progressBarlite);
     mySwipeRefreshLayout = 
       (SwipeRefreshLayout)this.findViewById(R.id.swipeContainer);
     this.webview = findViewById(R.id.webview);


WebViewClientImpl webViewClient = new WebViewClientImpl(this);
                webview.setWebViewClient(webViewClient);


                webview.setVisibility(View.GONE);
                mySwipeRefreshLayout.setVisibility(View.GONE);


 public class WebViewClientImpl extends WebViewClient {

            private Activity activity = null;


            public WebViewClientImpl(Activity activity) {
                this.activity = activity;

            }

            @Override
            public boolean shouldOverrideUrlLoading(WebView View, String url) {

//here i set the domains the webview can browse
                if (url.contains("ur domain"))
                    return false;
                Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                activity.startActivity(intent);

                return true;


            }

//here i show the progress bar
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
                mySwipeRefreshLayout.setVisibility(View.GONE);
                progressBar.setVisibility(View.VISIBLE);
                webview.setVisibility(View.GONE);

            }

//here i hide the progress bar
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);

                progressBar.setVisibility(View.GONE);
                webview.setVisibility(View.VISIBLE);
                mySwipeRefreshLayout.setVisibility(View.VISIBLE);

                if (mySwipeRefreshLayout.isRefreshing()) {
                    mySwipeRefreshLayout.setRefreshing(false);
                }

            }

//here i hide the progress bar and also load a locally saved error messege
            @Override
            public void onReceivedError(WebView view, int errorCode, String description, String url) {
                view.loadUrl("file:///android_asset/error.html");
                progressBar.setVisibility(View.GONE);
                mySwipeRefreshLayout.setVisibility(View.VISIBLE);
                webview.setVisibility(View.VISIBLE);

                if (mySwipeRefreshLayout.isRefreshing()) {
                    mySwipeRefreshLayout.setRefreshing(false);
                }

            }

            public class MediaWebView extends WebView {

                public MediaWebView(Context context) {
                    super(context);
                }

                public MediaWebView(Context context, AttributeSet attrs) {
                    super(context, attrs);
                }

                public MediaWebView(Context context, AttributeSet attrs, int defStyleAttr) {
                    super(context, attrs, defStyleAttr);
                }

                @Override
                protected void onWindowVisibilityChanged(int visibility) {
                    if (visibility != View.GONE) super.onWindowVisibilityChanged(View.VISIBLE);
                }

            }

        }
}

为了使其正常工作,非常重要的是您将进度条和包含它的线性布局的重力调用为“center”

<LinearLayout
        android:gravity="center"/>


        <ProgressBar
            android:gravity="center"/>
</LinearLayout>

这是我的styles.xml文件:

<resources>
 <style name="ProgressBarlit" parent="Theme.AppCompat">
        <item name="colorAccent">@color/progressback</item>
        <item name="android:minWidth">32dp</item>
        <item name="android:maxWidth">50dp</item>
    </style>
    <style name="ProgressBardrk" parent="Theme.AppCompat">
        <item name="colorAccent">@color/colorAccentDarkprgress</item>
        <item name="android:minWidth">32dp</item>
        <item name="android:maxWidth">50dp</item>
        <item name="android:minHeight">32dp</item>
        <item name="android:maxHeight">100dp</item>
    </style>


</resources>

希望这可以帮到你,我知道它回答了不止这个问题,但你会在这里找到你的答案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接