首页 > 解决方案 > 尽管有 ProgressBar,但 FloatingActionButton 可见

问题描述

我有一个带有一个 FAB 和一个自定义进度条的布局,所有这些都在 CoordinatorLayout 内。我的进度条在数据加载期间隐藏了所有布局内容,但不隐藏 FAB。

我试图将 Progressbar 移动到布局的所有位置,但 FAB 始终可见。

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/Recycler1"
    style="@style/MyStyle1"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />

<com.google.android.material.floatingactionbutton.FloatingActionButton
    android:id="@+id/FAB1"
    style="@style/MyStyle2"
    app:srcCompat="@drawable/ic_event_black_24dp" />

<ProgressBar
    android:id="@+id/Progressbar1"
    style="@style/MyStyle3" />

这是我的活动代码

public class MyFragment extends Fragment {

    private View view;
    private RecyclerView Recycler1;
    private ProgressBar Progressbar1;
...
    private Context context;
    private List<...> array_data;
    private RequestQueue queue;
...


    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        context = getActivity();
        view = inflater.inflate(R.layout.my_fragment, container, false);
        Progressbar1 = view.findViewById(R.id.Progressbar1);
        FloatingActionButton FAB1 = view.findViewById(R.id.FAB1);
...
        Recycler1 = view.findViewById(R.id.Recycler1);
        Recycler1.setHasFixedSize(true);
        Recycler1.setLayoutManager(new LinearLayoutManager(context));
...
        // Set Volley queue
        queue = Volley.newRequestQueue(context);

        return view;
    }


    @Override
    public void onResume() {
        super.onResume();
        Progressbar1.setVisibility(View.VISIBLE);
getData();
    }


    private void getData() {
        array_data = new ArrayList<>();
        JsonArrayRequest jsArrRequest = new JsonArrayRequest(
...
            @Override
            public void onResponse(JSONArray response) {
                try {
...
                    Progressbar1.setVisibility(View.GONE);
                } catch (Exception e) { e.printStackTrace(); }
            }
        }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { ... }})
        { @Override public Map<String, String> getHeaders() { return ... } };

        queue.add(jsArrRequest);
    }
}

编辑我忘了写我的自定义进度条的背景是不透明的,所以它会自动覆盖布局中的所有其他项目。

<style name="MyStyle3">
    <item name="android:layout_width">match_parent</item>
    <item name="android:layout_height">match_parent</item>
    <item name="android:layout_gravity">center</item>
    <item name="android:background">@color/colorWhite</item>
    <item name="android:indeterminateDrawable">@drawable/progress_bar</item>
</style>

自定义进度条可绘制:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@android:id/progress">
        <rotate 
            android:toDegrees="1800">
            <shape
                android:innerRadius="25dp"
                android:shape="ring"
                android:thickness="4dp"
                android:useLevel="false">
                <gradient
                    android:endColor="@color/colorBlue"
                    android:startColor="@color/colorWhite"
                    android:type="sweep" />
            </shape>
        </rotate>
    </item>
</layer-list>

在此处输入图像描述

我想在 Progressbar 可见时隐藏 FAB,在布局中设置正确的属性,而不是以编程方式执行此操作。进度条必须与 FAB 重叠。

标签: androidxmllayoutprogress-barfloating-action-button

解决方案


一、隐藏进度条的可见性

<ProgressBar
    android:id="@+id/Progressbar1"
    android:visibility="invisible"
    style="@style/MyStyle3" />

之后,当您需要使用它并隐藏 FAB 按钮时,使进度条可见

progressBar.setVisibility(View.VISIBLE);
FAB1.setVisibility(View.INVISIBLE);

您可以将 FAB 可见性设置为GONE而不是和之间INVISIBLE 的区别是GONEINVISIBLE

无形的:

这个视图是不可见的,但它仍然占用空间用于布局。

消失:

此视图是不可见的,并且它不占用任何空间用于布局目的。


推荐阅读