尽管有 ProgressBar,但 FloatingActionButton 可见

FloatingActionButton visible despite of ProgressBar

我有一个包含一个 FAB 和一个自定义进度条的布局,它们都在 CoordinatorLayout 中。 我的进度条在数据加载期间隐藏所有布局内容,但不隐藏 FAB。

我尝试在布局的所有位置移动进度条,但 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" />

这里是我的 Activity 代码

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 重叠。

首先,隐藏进度条的可见性

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

然后在需要使用时显示进度条并隐藏 FAB 按钮

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

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

不可见:

This view is invisible, but it still takes up space for layout purposes.

消失:

This view is invisible, and it doesn't take any space for layout purposes.

您可以在 activity 中创建一个方法,例如 showProgress(boolean status)

private void showProgress(boolean status){
  if(status){
     Progressbar1.setVisibility(View.VISIBLE);
     FAB1.setVisibility(View.GONE); // decleare FAB1 globally like Progressbar1
  }else{
     Progressbar1.setVisibility(View.GONE);
     FAB1.setVisibility(View.VISIBLE);
  }
}

并在您想要显示或隐藏您的 progressbar 时调用它。

在您的 onResume

中显示 progressbar
@Override
public void onResume() {
    super.onResume();
    showProgress(true);
    getData();
}

progressbar 隐藏在您的 getData

private void getData() {
        array_data = new ArrayList<>();
        JsonArrayRequest jsArrRequest = new JsonArrayRequest(
        //...
            @Override
            public void onResponse(JSONArray response) {
                try {
                    //...
                    showProgress(false); // call method here and pass false
                } catch (Exception e) { e.printStackTrace(); }
            }
        }, new Response.ErrorListener() { 
               @Override 
               public void onErrorResponse(VolleyError error) { 
                   // also here you have to close your progressbar 
                   showProgress(false);
                   //...
               }
            })
        { @Override public Map<String, String> getHeaders() { return ... } };

        queue.add(jsArrRequest);
    }

选项 - 1: 您必须通过更新 elevation 来修改 FloatingActionButton 的默认 Z 轴 行为].

app:elevation="0dp"

选项 - 2: 如果你想保持 FAB 的默认行为,那么你必须更新你的 my_fragment.xml 如下:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.coordinatorlayout.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
        <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" />
    </androidx.coordinatorlayout.widget.CoordinatorLayout>


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

</FrameLayout>