尽管有ProgressBar,但仍可见FloatingActionButton

时间:2019-10-24 08:40:47

标签: android xml layout progress-bar floating-action-button

我有一个带有一个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" />

这里我的活动代码

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>

Troubleshooting

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

3 个答案:

答案 0 :(得分:1)

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

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

之后,在需要使用进度条时将其显示出来,并隐藏FAB按钮

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

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

不可见:

  

此视图是不可见的,但仍会占用布局空间   目的。

消失:

  

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

答案 1 :(得分:1)

您可以在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时调用它。

要在您的progressbar中显示onResume

@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);
    }

答案 2 :(得分:1)

选项-1:。您必须通过更新FloatingActionButton来修改elevation的默认 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>